pythonでのログ(logging)
ロガーは名前で管理される。逆に、同じ名前のロガーは同じものとして扱われる。 それを利用するために、モジュール側ではモジュール名(name)をロガーの名前にしておいて、ユーザ側はモジュールの名前を指定することで当該のロガーを取得して、個別に設定することが可能。 例えば、hoge/foo/bar.pyモジュールの名前はhoge.foo.barになる。
ライブラリ側
- モジュール(ファイル)の先頭でloggerを生成して、適時出力するだけ。
- configはトップから渡されることを想定する。
import logging logger = logging.getLogger(__name__) # __name__はモジュール名 class Hoge: def __init__(self): logger.info('A Hoge instance is generated.') def foo(self): logger.debug('Hoge/foo is called.')
ユーザ側
- ライブラリ側のloggerのconfigを与える。
- configにはログのレベル、フォーマット、出力先ファイルなどを設定。デフォルではlogging.WARNINGが設定されている。
- ロガー毎に指定するなら、package.moduleでモジュール毎にロガーを取得しても良いが、プログラムとして一括で設定する場合には、rootロガーに設定すれば良い。ルートロガーはgetLoger("")で取得可能。
import logging logging.basicConfig() # confiを設定 # package/module.pyのロガーをDEBUGで動かす logging.getLogger('package_name.module_name').setLevel(level=logging.DEBUG) # 一括して設定したい場合にはrootロガーに設定する。 logging.getLoger("").setLevel(logging.DEBUG)
config
- formatterのメタ文字は、asctime(ASCII時刻)、filename(ファイル名), funcName(関数名)、module(モジュール名)、message(メッセージ)
# レベル設定 logging.setLevel(logging.DEBUG) # 出力フォーマット formatter = logging.Formatter('%(levelname)s:(%(module)s/%(name)s/%(lineno)d:"%(message)s"') # ファイル名設定 fh = logging.FileHandler('hoge.log') fh.setFormatter(formatter) logging.addHandler(fh) # 標準出力 sh = logging.StreamHandler() sh.setFormatter(formatter) logging.addHandler(sh)