我有多个Python模块,每个模块都有单独的日志配置文件。我正在使用Yaml,所以我只是做了一个
log_config_dict=yaml.load(open(config_file1, 'r'))
logging.config.dictConfig(log_config_dict)
self.main_logger=logging.getLogger('Main_Logger')
在另一个模块中,我有类似
的内容 log_config_dict=yaml.load(open(config_file2, 'r'))
logging.config.dictConfig(log_config_dict)
self.main_logger=logging.getLogger('Poller_Main_Logger')
2个记录器正在写入单独的日志文件。然后在每个单独模块的代码中,我记录为 -
self.main_logger.info(log_str)
但是这没有按预期工作。假设我从module1进行记录,然后从module2进行记录,然后再从module1进行记录,将日志消息写入module2的目标,或者根本不写入。
知道发生了什么事吗?问题是每次我进行dictConfig调用时,以前的记录器都被禁用了吗?有没有办法解决这个问题?
下面 - 其中一个日志配置文件
version: 1
formatters:
default_formatter:
format: '%(asctime)s : %(levelname)s : %(message)s'
datefmt: '%d-%b-%Y %H:%M:%S'
plain_formatter:
format: '%(message)s'
handlers:
console_default_handler:
class: logging.StreamHandler
level: INFO
formatter: default_formatter
stream: ext://sys.stdout
console_error_handler:
class: logging.StreamHandler
level: WARNING
formatter: default_formatter
stream: ext://sys.stderr
logfile_handler:
class: logging.FileHandler
filename: logger.txt
mode: a
formatter: default_formatter
level: DEBUG
errfile_handler:
class: logging.FileHandler
filename: error.txt
mode: a
formatter: default_formatter
level: WARNING
plain_handler:
class: logging.StreamHandler
level: DEBUG
formatter: plain_formatter
stream: ext://sys.stdout
loggers:
Poller_Main_Logger:
level: DEBUG
handlers: [console_default_handler,logfile_handler]
propagate: no
Plain_Logger:
level: DEBUG
handlers: [plain_handler]
propagate: no
Error_Logger:
level: WARNING
handlers: [errfile_handler,console_error_handler,logfile_handler]
propagate: no
root:
level: INFO
handlers: [console_default_handler]
答案 0 :(得分:1)
logging
不支持您想要的使用模式。默认情况下,重新运行logging.config.dictConfig()
会破坏所有现有的记录器,处理程序和格式化程序。可以在配置字典中使用incremental
和disable_existing_loggers
选项,但使用incremental
,您无法加载新的处理程序或格式化程序。您需要将配置组合到整个程序的单个文件中,或者使用模块中提供的机制手动构建并向记录器添加格式化程序和处理程序。