1

複数の 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 呼び出しを行うたびに、以前のロガーが無効になるという問題はありますか? これを回避する方法はありますか?

以下 - ログ構成ファイルの 1 つ

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]
4

1 に答える 1

1

loggingここで必要な使用パターンをサポートしていません。デフォルトでは、再logging.config.dictConfig()実行すると、既存のすべてのロガー、ハンドラー、およびフォーマッターが吹き飛ばされます。config dict で使用できるincrementalおよびオプションがありますが、を使用すると、新しいハンドラまたはフォーマッタをロードできません。プログラム全体の構成を単一のファイルに結合するか、モジュールで提供されるメカニズムを使用して、フォーマッターとハンドラーを手動で構築し、ロガーに追加する必要があります。disable_existing_loggersincremental

于 2012-12-10T15:58:54.353 に答える