こんにちは。
今日は、loggingを複数ファイル・モジュール間で使う方法について調べたので、そのメモを書きます。ログの設定については下記に書いたので、今回は複数ファイル・モジュール間で使う方法についてだけ描きます。
やり方
公式ドキュメントに書いてあります。
基本的に、 logging.getLogger('someLogger')
のような感じでloggerを定義して、複数ファイルやモジュールで複数回同じように呼び出せば、同じ参照先を返すので、特に考える必要がありません。
具体的には、以下のような感じです。
main.py
# coding:utf-8 from logging import getLogger, StreamHandler, DEBUG, Formatter, FileHandler logger = getLogger('Log') handler = StreamHandler() logger.setLevel(DEBUG) handler.setLevel(DEBUG) formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) fh = FileHandler(filename='log.txt') fh.setLevel(DEBUG) fh.setFormatter(formatter) logger.addHandler(fh) # 別ファイルの参照 import sub logger.debug("Hello main") # 別ファイルのsub.pyのログ sub.log()
sub.py
# coding:utf-8 # ログのライブラリ from logging import getLogger # main.pyで宣言したloggerの子loggerオブジェクトの宣言 logger = getLogger("Log").getChild("sub") def log(): logger.debug("Hello sub")
main.py
を実行
実行すると、以下の出力がlog.txtに出てきます。
2018-07-31 01:48:44,504 - Log - DEBUG - Hello main 2018-07-31 01:48:44,504 - Log.sub - DEBUG - Hello sub
このような形で複数モジュール間で、log出力を受け継ぐことができます。
まとめ
宣言時の logging.getLogger('someLogger')
の部分で、 'someLogger' を複数モジュール間で同じく宣言すれば、同じPythonインタプリタプロセス上で動いている限り、複数モジュール間で跨いで使うことができます。
本日は以上。それでは。