python - 多个实例和多个目的地

标签 python logging configuration

我有多个 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]

最佳答案

logging 不支持您想要的使用模式。默认情况下,重新运行 logging.config.dictConfig() 会清除所有现有的记录器、处理程序和格式化程序。有 incrementaldisable_existing_loggers 选项可在配置字典中使用,但使用 incremental 时,您无法加载新的处理程序或格式化程序。您要么需要将整个程序的配置合并到一个文件中,要么使用模块中提供的机制手动构造格式化程序和处理程序并将其添加到记录器。

关于python - 多个实例和多个目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803747/

相关文章:

python - 将数据表合并到同一列

python - 如何将文本文件数据导出到mysql数据库

python - 拆分字符串而不删除分隔符,但抑制空捕获组

node.js - 自定义记录器和 Socket.io 1.x

Linux 内核配置官方文档

performance - 为什么 Spark 不将作业分配给所有执行程序,而是仅分配给一个执行程序?

gradle - Gradle dockerCompose插件为所有任务保留最新配置

python - Django 形式。如何从 initial_text 隐藏冒号?

java - 对一个异常禁用日志记录

python - 为什么此代码段失败并显示 `` AttributeError : 'CustomAdapter' object has no attribute 'setLevel' ``?