Pythonでは、複数のpyファイルのloggingを同じログlogファイルに出力する方法

3898 ワード

Pythonでは、複数のpyファイルのloggingを同じログlogファイルに出力する方法
転載:https://www.crifan.com/python_output_multiple_script_logging_into_single_log_file/
【問題】
比較的長いpythonスクリプトファイルがあり、logログ出力についてはloggingが使用され、対応する初期化コードは:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14 logging.basicConfig(                  level    = logging.DEBUG,                  format    = 'LINE %(lineno)-4d  %(levelname)-8s %(message)s' ,                  datefmt  = '%m-%d %H:%M' ,                  filename = scriptSelfName + ".log" ,                  filemode = 'w' ); # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler(); console.setLevel(logging.INFO); # set a format which is simpler for console use formatter = logging.Formatter( 'LINE %(lineno)-4d : %(levelname)-8s %(message)s' ); # tell the handler to use this format console.setFormatter(formatter); logging.getLogger('').addHandler(console);
そしてlogging.info,logging.debugなどは対応するログファイルBlogToWordpressにログを入力することができる.ロゴが当たった.
現在、このファイルは大きすぎるため、メインファイルBlogToWordpressに分けられています.pyとBlogNeteaseのような複数のサブファイル.py,crifanLib.pyなど.
分割された後、サブファイルのlog出力では、直接loggingを使用できないようです.
それからprintしか使えなくて、とても不快です.
サブファイルのloggingとプライマリファイルのloggingの出力は、同じlogファイル、すなわちプライマリファイルが生成したそのlogファイルに出力されることが望ましい.
【解決プロセス】
1.pyモジュールがサブモジュールとして呼び出される前の初期化を理解したばかりであるため:
【解決済み】Pythonでは、モジュールをインポートする前に、どのように初期化するか
まず,サブモジュール初期化においても同様にloggingを用い,独自のloggingファイルを個別に生成し,テストコードは以下の通りである.
?
1
2
3
4
5
6
7
8
9
10
11
12 #------------------------------------------------------------------------------   if __name__ = = "BlogNetease" :      print "BlogNetease is imported from others" ;
       logging.basicConfig(                      level    = logging.DEBUG,                      filename = "BlogNetease.log" ,                      filemode = 'w' ,                      );
       logging.info( "logging output info from BlogNetease is OK ." );      print "BlogNetease import end" ;
テストの結果は奇妙で、サブファイルが再構成されたloggingのようで、メインファイルのloggingファイルをハイジャックし、次の出力は、サブファイルのlogファイルに出力されました.これは私が望んでいるものではありません.pyファイルごとに独自のlogファイルがあります.
2.その後、サブファイルについては、複数の残高外設定は全く必要なく、次のようにします.
import logging;
次にloggingを直接使用する.info,logging.debug関数は、ログの内容を出力、具体的な出力の形式は、メインファイル用loggingに依存する.basicConfigが構成した形式.入力した場所、すなわちメインファイルのlogファイル.
これにより、少なくとも、複数のpyファイルのloggingコンテンツを同じプライマリファイルのlogファイルに出力し、フォーマットが設定され、統一されることが好適に実現される.
【まとめ】マスターファイルにloggingを設定.basicConfig関連パラメータ、StreamHandlerなどを構成した後、サブファイルは、loggingモジュールをインポートしてloggingを呼び出すだけです.info,logging.debug関数は、log情報をプライマリファイルのlogに入力することを実現します.