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)