首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多实例、多目标

多实例、多目标
EN

Stack Overflow用户
提问于 2012-12-10 23:18:19
回答 1查看 364关注 0票数 1

我有多个Python模块,每个模块都有单独的日志配置文件。我使用的是Yaml,所以我只做了一个

代码语言:javascript
复制
    log_config_dict=yaml.load(open(config_file1, 'r'))
    logging.config.dictConfig(log_config_dict)             
    self.main_logger=logging.getLogger('Main_Logger')

在另一个模块中,我有类似于

代码语言:javascript
复制
   log_config_dict=yaml.load(open(config_file2, 'r')) 
   logging.config.dictConfig(log_config_dict)       
   self.main_logger=logging.getLogger('Poller_Main_Logger')

两个记录器分别写入不同的日志文件。然后在每个单独模块的代码中,我将日志记录为-

代码语言:javascript
复制
     self.main_logger.info(log_str) 

然而,这并不像预期的那样工作。假设我从module1记录日志,然后从module2记录,再从module1记录,日志消息要么写入模块2的目的地,要么根本不写入。

知道发生了什么吗?是否存在每次执行dictConfig调用时都禁用以前的记录器的问题?有什么办法可以解决这个问题吗?

下面-其中一个日志配置文件

代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-10 23:58:54

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13803747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档