【发布时间】: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")
当我运行脚本时,会发生两件事
- 在标准输出上,我收到一条日志消息。这符合预期
2021-12-19 20:49:06,428: streamhandler_test.py: module:<module>: INFO: this is a test
- 在 /homedir/LOGS 中创建了一个空文件 opslog.log。这(对我来说)出乎意料。
“opslog.log”显然是由 opsLogFileHandler 创建的 所以我的脚本以某种方式调用了“opsLogFileHandler”。
我猜它与继承有关,但作为 我调用了根记录器,我看不出为什么不相关的 opsLogFileHandler(它只绑定到“opslog”记录器)应该创建一个空文件。
另外,如果我正确理解了继承,那么从任何非根记录器到根记录器都有一个子 -> 父关系(除非传播设置为 False),但反之则不然。
我尝试通过阅读文档找到答案,但坦率地说,文档很复杂,我无法解决。
非常欢迎任何关于为什么创建该文件“opslog.log”的解释
【问题讨论】: