![](/img/trans.png)
[英]How do I use multiple settings file in Django with multiple sites on one server?
[英]How do you log server errors on django sites
因此,在進行開發時,我可以將settings.DEBUG
為True
,如果發生錯誤,我可以看到它的格式很好,具有良好的堆棧跟蹤和請求信息。
但是在某種生產站點上,我寧願使用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已被替換為:
顯然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.