【问题标题】:Multiple instances and multiple destinations多个实例和多个目的地
【发布时间】:2012-12-10 15:18:19
【问题描述】:

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

但是,这并没有按预期工作。假设我从模块 1 进行日志记录,然后从模块 2,然后再次从模块 1,日志消息要么写入模块 2 的目标,要么根本不写入。

知道发生了什么吗?问题是每次我进行 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]

【问题讨论】:

  • 你的 yamls 里有什么?我敢打赌,正在加载的字典都默认修改根记录器,因为它们没有另行指定。
  • 这是其中之一:见上文

标签: python logging configuration


【解决方案1】:

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

【讨论】:

  • 非常感谢!我找不到太多关于增量的信息。如果您有任何链接,请您发布它们吗?谢谢
  • 我主要是看日志模块中的代码,但docs.python.org/2/library/…
  • 哦,你看的是代码本身。因为那段话不多……我的意思是它更像是一个抽象的评论
  • 重要的是你不能按照你想做的方式做你想做的事,真的。记录器配置器是围绕在您使用记录器记录任何内容之前运行一次的想法构建的。如果您想在配置它们之后修改它们的行为方式(通过记录任何内容或显式地隐式),您需要通过管理记录器的手动机制来做到这一点。
  • 谢谢,我明白了,我会写一些代码来手动完成。但是很遗憾我们没有这个功能
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 2020-07-31
相关资源
最近更新 更多