【问题标题】:With DEBUG=False, how can I log django exceptions to a log file使用 DEBUG=False,我如何将 django 异常记录到日志文件中
【发布时间】: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 sitesHow can I see error logs of Django viewsHow do you log server errors on django sites。答案似乎涉及一些中间件。是否有可用的代码 sn-p,或者是否包含这些电池?

【问题讨论】:

    标签: django error-handling django-settings


    【解决方案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"},
        },
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2012-10-06
      • 2011-07-12
      • 2021-07-09
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多