代码之家  ›  专栏  ›  技术社区  ›  Bryce

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

  •  19
  • Bryce  · 技术社区  · 11 年前

    当DEBUG=True时,Django异常转储到stderr,stderr通常由web服务器发送到旋转日志文件。

    当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 如何在django网站上记录服务器错误 答案似乎涉及到一些中间件。是否有可用的代码片段,或者是否包括这些电池?

    4 回复  |  直到 7 年前
        1
  •  22
  •   Thibault J    11 年前

    这是一个完整的工作日志配置。严重错误会记录到sentry中,警告会通过电子邮件发送给管理员,正常通知错误会记录在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,
            },
        }
    }
    
        2
  •  19
  •   Cani    7 年前

    Django使用日志过滤器来决定 console 默认情况下使用或不使用处理程序。另请参阅 django.utils.log on Github .

    要保持相同的行为而不将消息过滤到控制台,只需在 settings.py 这样地:

    from django.utils.log import DEFAULT_LOGGING
    
    DEFAULT_LOGGING['handlers']['console']['filters'] = []
    
        3
  •  5
  •   citynorman    7 年前

    这是另一种方法,它的复杂性介于其他答案的一半,同时记录到控制台和文件

    # 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
  •  3
  •   Chris McCormick    6 年前

    以下是最小有效Django LOGGING 将异常回溯记录到stderr所需的配置片段。

    把这个放在你的末尾 settings.py :

    LOGGING = {
        "version": 1,
        "disable_existing_loggers": False,
        "handlers": {
            "console": {
                "class": "logging.StreamHandler",
            },
        },
        "loggers": {
            "django": {"handlers": ["console"], "level": "INFO"},
        },
    }