使用DEBUG = False,如何将django异常记录到日志文件中

问题描述 投票:10回答:4

使用DEBUG = True,Django异常转储到stderr,这通常由Web服务器发送到旋转日志文件。

使用DEBUG = False,Django会将异常通过电子邮件发送到ADMINS =。

如何使用DEBUG = False保留DEBUG = True行为?

我读过How do you log server errors on django sitesHow can I see error logs of Django views以及How do you log server errors on django sites。答案似乎涉及一些中间件。是否有可用的代码段,或者是否包含这些电池?

django error-handling django-settings
4个回答
12
投票

这是一个完整的日志配置。严重错误记录到哨兵,警告通过电子邮件发送给管理员,正常通知错误记录到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,
        },
    }
}

11
投票

Django使用日志记录过滤器来确定默认使用或不使用console处理程序。另见django.utils.log on Github

要在不将消息过滤到控制台的情况下保持相同的行为,只需在settings.py中禁用过滤,如下所示:

from django.utils.log import DEFAULT_LOGGING

DEFAULT_LOGGING['handlers']['console']['filters'] = []

1
投票

这是另一种方法,在其他答案之间的中间复杂性,记录到控制台和文件

# 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'),
        },
    },
}

0
投票

这是将异常回溯记录到stderr所需的最小有效Django LOGGING配置代码段。

把它放在settings.py的末尾:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "loggers": {
        "django": {"handlers": ["console"], "level": "INFO"},
    },
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.