使用 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

DEBUG 为 False 时无静态文件

设置 debug = False 会使 Django 应用程序崩溃并出现以下错误,如何解决?

Django 无法识别 DEBUG = False

Djang DJANGO_SETTINGS_MODULE

如何在 django 模板中检查 DEBUG true/false - 完全在 layout.html [重复]