【问题标题】:Why logs are empty after logging.config.dictConfig(...)?为什么在 logging.config.dictConfig(...) 之后日志是空的?
【发布时间】:2021-12-18 21:13:35
【问题描述】:

原标题是“How to find a problen in python logging configuration?”

我有一个相当大的项目,有很多记录器。我有运行项目的包装器,它有一些日志记录。一切正常。

然后我制作了另一个包装器以将项目作为cherrypy 提供服务,并注意到我有日志记录问题。

我经常与设置作斗争,但没有将任何其他日志打印到文件中。

这是我的cherrypy wrapper 的日志配置。

{
        'formatters': {
            'standard': {
                'format': '%(message)s'
            },
        },
        'handlers': {
            'b2_debug': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',
                'formatter': 'standard',
                'filename': 'b2_debug.log',
                'maxBytes': 1048576,
                'backupCount': 20,
                'encoding': 'utf8'
            },
            'cherrypy_access': {
                # same as b2_debug, but another filename]
            },
            'cherrypy_error': {
                # same as b2_debug, but another filename]
            },
        },
        'loggers': {
            '': {
                'handlers': ['b2_debug'],
                'level': 'DEBUG'
            },
            'cherrypy.access': {
                'handlers': ['cherrypy_access'],
                'level': 'INFO',
                'propagate': False
            },
            'cherrypy.error': {
                'handlers': ['cherrypy_error'],
                'level': 'INFO',
                'propagate': False
            },
        }
}

我有很多活跃的记录器,但在cherrypy下不知何故b2_debug.log是空的。

两个问题:

  1. 如何调试记录器的行为?当我执行logging.getLogger('test').warn('test') 时,是否有任何工具可以跟踪事件的移动?

  2. 知道什么会导致 root '' logger 不记录任何内容吗?看起来有些东西会覆盖根记录器的行为。

我已经对简单的单一文件进行了测试,一切正常。但是我不知道如何找到非常大的项目的问题。

【问题讨论】:

  • 您使用的是相对路径名。尝试绝对路径。它可能正在写日志,但只是在与您想象的不同的地方。您可以在日志语句之前进入调试器并单步执行它以查看它的去向。具体如何做到这一点因环境而异。如果您在同一台机器上,一个简单的breakpoint() 就可以做到。我搜索了“debug cherrypy”并得到了一些有趣的结果。当您到达要写入的文件时,文件对象的name 属性加上os.path.abspath 将是一个很好的线索。
  • 您确定您正在使用日志记录级别 DEBUG 测试应用程序吗?否则,调试处理程序永远不会记录任何内容。
  • @cyraxjoe 是的,但我也使用警告和临界水平

标签: python logging cherrypy


【解决方案1】:

disable_existing_loggers参数,默认为True。我将其更改为False,现在一切正常。

刚刚将其添加为附加配置字典键'disable_existing_loggers': True,

重要提示:我使用logging.config.dictConfig(DICT)。这就是我每次logger.disabled = True

感谢@tdelaney 提醒我有关断点的信息。发现问题非常简单。我注意到 python 检查 logger.isEnabledFor() 并以某种方式被禁用。我记得在文档中看到过类似的内容。这有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2013-03-08
    • 2017-12-01
    相关资源
    最近更新 更多