【问题标题】:root logger invokes filehandler from non-root logger - I'm trying to understand why根记录器从非根记录器调用文件处理程序 - 我试图理解为什么
【发布时间】:2022-01-21 15:57:02
【问题描述】:

所以我有一个像这样的日志记录 dictconfig

import logging.handlers
from logging.config import dictConfig



LOGGING_DIR = '/homedir/LOGS'

LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        '': {  # root logger - logs to sys.stdout
            'level': 'NOTSET',
            'handlers': ['rootLoggerStreamHandler'],
        },
        'opslog': {  # logs modules in their own logfile
            'level': 'NOTSET',
            'handlers': ['opsLogFileHandler'],
            'propagate': False
        }
    },
    'handlers': {
        'rootLoggerStreamHandler': {
            'level': 'DEBUG',
            'formatter': 'simpleFormatter',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
        'opsLogFileHandler': {
            'level': 'INFO',
            'formatter': 'simpleFormatter',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': f'{LOGGING_DIR}/opslog.log',
            'mode': 'a',
            'maxBytes': 200000000,
            'backupCount': 2,
            'encoding': None,
            'delay': False
        },
    },
    'formatters': {
        'simpleFormatter': {
            'format': '%(asctime)s: %(filename)s: module:%(funcName)s: %(levelname)s: %(message)s'
        },
    },

}

我写了一个这样的测试脚本:

import logging
import logging.config
import logger_config # file that contains a dict with logger config.


logging.config.dictConfig(logger_config.LOGGING_CONFIG)
logger = logging.getLogger() # will get the root logger


logger.info("this is a test")

当我运行脚本时,会发生两件事

  1. 在标准输出上,我收到一条日志消息。这符合预期
2021-12-19 20:49:06,428: streamhandler_test.py: module:<module>: INFO: this is a test
  1. 在 /homedir/LOGS 中创建了一个空文件 opslog.log。这(对我来说)出乎意料。

“opslog.log”显然是由 opsLogFileHandler 创建的 所以我的脚本以某种方式调用了“opsLogFileHandler”。

我猜它与继承有关,但作为 我调用了根记录器,我看不出为什么不相关的 opsLogFileHandler(它只绑定到“opslog”记录器)应该创建一个空文件。

另外,如果我正确理解了继承,那么从任何非根记录器到根记录器都有一个子 -> 父关系(除非传播设置为 False),但反之则不然。

我尝试通过阅读文档找到答案,但坦率地说,文档很复杂,我无法解决。

非常欢迎任何关于为什么创建该文件“opslog.log”的解释

【问题讨论】:

    标签: python logging


    【解决方案1】:

    opslog.log 文件是在您创建 opsLogFileHandler 处理程序时创建的,因为 delay 参数在其配置中设置为 False。 (如果delayTrue,则文件直到第一次需要写入内容时才会打开。)

    处理程序是在您进行配置时创建的。因此,只要您调用dictConfig(),该opslog.log 文件就会被打开以进行追加,并且如果它不存在,则将其创建为准备写入的空文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多