【问题标题】:Why Django logging skips log entries?为什么 Django 日志记录会跳过日志条目?
【发布时间】:2016-08-02 22:45:56
【问题描述】:

这是我的设置模块:

LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'handlers': {
    'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': '/django-python/django/testapp/testapp.log',
    },
  },
  'loggers': {
    'django': {
        'handlers': ['file'],
        'level': 'DEBUG',
        'propagate': True,
    },
  },
}

这是我在视图文件中的代码:

import logging
logger = logging.getLogger(__name__)
logger.info("this is an error message!!")

我正在从各个模块获取以前的日志,但没有上面的日志条目“这是一条错误消息”。

【问题讨论】:

    标签: django django-logging


    【解决方案1】:

    您的日志记录配置仅捕获 django 命名空间内的日志。

    这一行:

    logger = logging.getLogger(__name__)
    

    ... 告诉记录器使用您的模块名称作为这些日志的命名空间 (docs)。如果您的模块名为mymodule,那么您可以通过在日志配置中添加类似这样的内容来捕获这些日志:

    'loggers': {
       'django' : {...},
       'mymodule': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
    

    【讨论】:

    • 只是在这里添加一点,如果您将此日志记录代码放在用户模块的视图中,__name__ 将输出users.view。因此,使用上面的 solarissmoke 示例,您可以将 mymodule 更改为 users.view
    • "modules" 让我很困惑,它基本上是需要使用的应用程序名称(几个应用程序可以是 django 项目的一部分),所以在 settings.py 中我不得不使用 appname.views “我的模块”
    【解决方案2】:

    您应该根据您的应用程序名称添加记录器配置 - 类似于

        'your_app_name': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    

    到目前为止,您已经声明了仅记录 django 默认消息(如系统错误)的记录器


    请注意,记录器消息的级别很重要,因此在您使用时

        logger.info("this is an error message!!")
    

    打印输出消息的方法,您的记录器的级别应为 INFO 或更严格

    【讨论】:

      【解决方案3】:

      您可以将“catch all”记录器添加到记录器部分:

      'loggers': {
          '': {
              'handlers': ['file'],
              'level': 'DEBUG',
          }
      }
      

      它将捕获 Django 的默认记录器未捕获的所有日志消息。

      【讨论】:

        【解决方案4】:
        import logging
        logger = logging.getLogger(__name__)
        

        添加后:

        logging.basicConfig(
            level = logging.DEBUG,
            format = '%(name)s %(levelname)s %(message)s',
        )
        

        或者只是添加 settings.py :

        import logging
        
            logging.basicConfig(
                level = logging.DEBUG,
                format = '%(name)s %(levelname)s %(message)s',
            )
        

        我们可以将格式更改为:

        format = '"%(levelname)s:%(name)s:%(message)s"  ',
        

        format = '%(name)s %(asctime)s %(levelname)s %(message)s',
        

        【讨论】:

          猜你喜欢
          • 2019-07-26
          • 1970-01-01
          • 2018-12-08
          • 2011-04-06
          • 2020-02-25
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 2011-09-16
          相关资源
          最近更新 更多