簡體   English   中英

你如何在 django 站點上記錄服務器錯誤

[英]How do you log server errors on django sites

因此,在進行開發時,我可以將settings.DEBUGTrue ,如果發生錯誤,我可以看到它的格式很好,具有良好的堆棧跟蹤和請求信息。

但是在某種生產站點上,我寧願使用DEBUG=False並向訪問者顯示一些標准錯誤 500 頁面,其中包含我目前正在修復此錯誤的信息;)
同時,我想通過某種方式將所有這些信息(堆棧跟蹤和請求信息)記錄到我服務器上的文件中 - 這樣我就可以將其輸出到我的控制台並觀察錯誤滾動,將日志通過電子郵件發送給我每小時或類似的事情。

您會為 django 站點推薦哪些日志記錄解決方案,以滿足這些簡單的要求? 我有作為fcgi服務器運行的應用程序,我使用 apache web 服務器作為前端(雖然考慮去 lighttpd)。

好吧,當DEBUG = False ,Django會自動將任何錯誤的完整追溯郵件發送給ADMINS設置中列出的每個人,這樣可以免費獲得通知。 如果您想要更細粒度的控件,可以編寫一個中間件類並將其添加到您的設置中,該類定義了一個名為process_exception()的方法,該方法可以訪問引發的異常:

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

然后,您的process_exception()方法可以執行您喜歡的任何類型的日志記錄:寫入控制台,寫入文件等等。

編輯:雖然它沒那么有用,但你也可以監聽got_request_exception信號,只要在請求處理過程中遇到異常,就會發送該信號:

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

不會給你訪問異常對象,然而,這樣的中間件的方法是非常容易的工作。

正如前面提到的,Django Sentry是一個很好的方法,但是正確設置它需要做一些工作(作為一個單獨的網站)。 如果您只想將所有內容記錄到一個簡單的文本文件中,那么您需要在settings.py輸入日志記錄配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

另一個答案中提到的django-db-log已被替換為:

https://github.com/dcramer/django-sentry

顯然James是正確的,但如果您想在數據存儲區中記錄異常,那么已經有一些開源解決方案可用:

1)CrashLog是一個不錯的選擇: http//code.google.com/p/django-crashlog/

2)Db-Log也是一個不錯的選擇: http//code.google.com/p/django-db-log/

兩者有什么區別? 幾乎沒有什么我能看到的,所以任何一個都足夠了。

我已經使用過它們並且效果很好。

自EMP最有用的代碼提交以來已經過去了一段時間。 我剛剛實現了它,並且在使用一些manage.py選項時,為了試圖追查一個bug,我得到了一個棄用警告,結果是我當前版本的Django(1.5。?)現在有一個require_debug_false過濾器mail_admins處理程序所需的。

這是修改后的代碼:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

我的fcgi腳本遇到了煩人的問題。 它發生在django甚至開始之前。 伐木的缺乏令人痛苦。 無論如何,將stderr重定向到文件,因為第一件事有很多幫助:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')

你可以在python中使用日志庫,不需要“pip install”任何東西

用“logging.debug()”替換任何“print()”但是,

Django Sentry 是一個不錯的選擇

正如 EMP 所說

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM