【问题标题】:Django file logger doesn't log as expectedDjango 文件记录器未按预期记录
【发布时间】:2018-10-11 11:23:04
【问题描述】:

我在我的 settings.py 中编写了一个简单的 django LOGGING,除了在我的文件中使用回溯记录所有错误。但它没有,它只是在一行中记录错误和所有内容,但回溯记录到控制台中。 这是我的日志:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
            'simple': {
                'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
                'style': '{',
            },
        },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'logs/debug.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        '': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

谁能帮我理解为什么和做什么? 谢谢。

【问题讨论】:

    标签: python django django-logging


    【解决方案1】:

    您使用的格式化程序是“简单的”(在配置中定义:

     'formatters': {
            'simple': {
                'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
                'style': '{',
            },
        },
    

    所以玩这个就是诀窍:看看这个:https://docs.python.org/3/library/logging.html#logrecord-attributes

    你可能想要的是:{stack_info}

    【讨论】:

    • 谢谢。有效!但它写在那个链接中你不需要自己格式化。我的另一个问题是为什么它也登录控制台?我没有在这里定义任何控制台日志处理程序...@Jmons
    • 嗯,这意味着如果您使用该变量,则不会传递第二个格式化程序:即,如果您使用“行号”之类的东西,您可以传递第二级格式化程序指定诸如前导 0 之类的东西。 logger 的“格式”是不同的 - 你说的是要在该日志行中打印出哪些字段。 一般而言您不希望在每个日志行上都有完整的堆栈跟踪 - 这表明您正在记录“错误”,即大多数日志行都是信息性的,而不仅仅是例外。
    【解决方案2】:

    要实现这一点,您可以添加自定义格式,然后为其编写自定义过滤器以填充其值:

    'formatters': {
    
        'simple_trace': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(trace)s'
        },
    

    现在,CustomFilter 应该继承自 logging.Filter 类似:

    class CustomFilter(logging.Filter):
    
        def filter(self, log_record):
    
            def _get_trace():
                trace = ""
                if log_record.levelname in ['ERROR', 'CRITICAL']:
                    # Get the recent stack-trace
                    trace = traceback.format_exc().strip()
                return json.dumps(trace)
    
            log_record.trace = _get_trace()
    

    像这样你也可以添加其他格式,只需在 log_record 中添加它的值。

    最后,我们需要继承处理程序(在您的情况下为 logging.FileHandler )并将此自定义过滤器添加到其中。

    class CustomHandler(logging.FileHandler):    
    
        def __init__(self, *args, **kwargs):
            logging.FileHandler.__init__(self, *args, **kwargs)
            self.addFilter(CustomFilter())
    

    在设置处理程序时,我们需要将 CustomHandler 放入类中:

    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging_custom.CustomHandler', # path to CustomHandler defination
            'filename': 'logs/debug.log',
            'formatter': 'simple_trace'
        },
    },
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2015-12-29
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多