使用 DEBUG=False,我如何将 django 异常记录到日志文件中
Posted
技术标签:
【中文标题】使用 DEBUG=False,我如何将 django 异常记录到日志文件中【英文标题】:With DEBUG=False, how can I log django exceptions to a log file 【发布时间】:2013-10-17 20:50:25 【问题描述】:如果 DEBUG=True,Django 异常会转储到标准错误,通常由网络服务器发送到循环日志文件。
如果 DEBUG=False,Django 会将异常通过电子邮件发送到 ADMINS=。
如何在 DEBUG=False 时保留 DEBUG=True 行为?
我读过How do you log server errors on django sites 和How can I see error logs of Django views 和How do you log server errors on django sites。答案似乎涉及一些中间件。是否有可用的代码 sn-p,或者是否包含这些电池?
【问题讨论】:
【参考方案1】:这是一个完整的工作日志配置。严重错误记录到哨兵,警告通过电子邮件发送给管理员,正常通知错误记录到 syslog,并在标准输出中提示调试消息。
LOGGING =
'version': 1,
'disable_existing_loggers': False,
'filters':
'require_debug_false':
'()': 'django.utils.log.RequireDebugFalse'
,
'formatters':
'verbose':
'format': '[contactor] %(levelname)s %(asctime)s %(message)s'
,
,
'handlers':
# Send all messages to console
'console':
'level': 'DEBUG',
'class': 'logging.StreamHandler',
,
# Send info messages to syslog
'syslog':
'level':'INFO',
'class': 'logging.handlers.SysLogHandler',
'facility': SysLogHandler.LOG_LOCAL2,
'address': '/dev/log',
'formatter': 'verbose',
,
# Warning messages are sent to admin emails
'mail_admins':
'level': 'WARNING',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
,
# critical errors are logged to sentry
'sentry':
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'raven.contrib.django.handlers.SentryHandler',
,
,
'loggers':
# This is the "catch all" logger
'':
'handlers': ['console', 'syslog', 'mail_admins', 'sentry'],
'level': 'DEBUG',
'propagate': False,
,
【讨论】:
某处是否有 stderr 记录器选项? logging.StreamHandler class 默认输出为 stderr。 所以如果我选中传播到 True,我会得到 DEBUG=True 通过 Apache 进行日志记录的行为? 您可能需要查看DEBUG entry in the doc。它与日志记录几乎没有关系。 logging doc 也很有帮助。 @ThibaultJ “在标准输出中得到提示。”你指的这个标准输出在哪里? :) 我正在使用 DigitalOceam、Gunicorn 和 nginx【参考方案2】:Django 使用日志过滤器来决定是否默认使用 console
处理程序。另见django.utils.log on Github。
要保持相同的行为而不将消息过滤到控制台,只需在您的 settings.py
中禁用过滤,如下所示:
from django.utils.log import DEFAULT_LOGGING
DEFAULT_LOGGING['handlers']['console']['filters'] = []
【讨论】:
将其添加到 settings.py 后在哪里可以找到日志文件? 将此添加到settings.py
会导致 Django 将错误发送到 stderr/stdout。记录的位置取决于您的网络服务器。
惊人的解决方案!
优秀的解决方案,虽然猴子补丁的 django 可能会被一些人不赞成。可以使用以下代替 LOGGING = deepcopy(DEFAULT_LOGGING) DEFAULT_LOGGING['handlers']['console']['filters'] = []【参考方案3】:
这是另一种复杂性介于其他答案之间的方法,将日志记录到控制台和文件
# settings.py
LOGGING =
'version': 1,
'disable_existing_loggers': False,
'handlers':
'console':
'class': 'logging.StreamHandler',
,
'file':
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'log.django',
,
,
'loggers':
'django':
'handlers': ['console','file'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
,
,
【讨论】:
有没有办法过滤日志,比如只有服务器错误?【参考方案4】:这是将异常回溯记录到 stderr 所需的最小有效 Django LOGGING
配置 sn-p。
把这个放在settings.py
的末尾:
LOGGING =
"version": 1,
"disable_existing_loggers": False,
"handlers":
"console":
"class": "logging.StreamHandler",
,
,
"loggers":
"django": "handlers": ["console"], "level": "INFO",
,
【讨论】:
以上是关于使用 DEBUG=False,我如何将 django 异常记录到日志文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Django 打印 sql 查询,因为 Debug 是 False