月曜日, 11月 10, 2008

[Python]設定ファイルを使ったログ記録

普段はprintで十分だけど、たまにしっかりとしたログを取りたくなる。そういうときに限って忘れているので、未来の自分へメモ。

設定ファイルの読み込みにはlogging.config.fileConfig(filename)を使うので、import loggingだけでなく、import logging.configもしなきゃダメ。

以下サンプル

設定ファイル
[loggers]
keys=root,logger01

[handlers]
keys=stdout01,file01

[formatters]
keys=form01

[logger_root]
level=NOTSET
handlers=stdout01

[logger_logger01]
lebel=DEBUG
handlers=stdout01,file01
propagate=0
qualname=top.mid

[handler_stdout01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)

[handler_file01]
class=FileHandler
level=WARNING
formatter=form01
args=("app.log",'w')

[formatter_form01]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter


サンプルコード
#-*- coding: utf-8 -*-
import logging
import logging.config

logging.config.fileConfig('./logging.conf')

#logger_root
logger = logging.getLogger()
logger.debug(logger.name)
logger.debug('DEBUGログ')
logger.warn('WARNINGログ')

#logger_logger01(top.mid)
logger = logging.getLogger('top.mid')
logger.debug(logger.name)
logger.info('infoログ')
logger.warn('warnログ')


以下、実行結果

標準出力
root: 2008-11-10 22:50:00,038 DEBUG root
root: 2008-11-10 22:50:00,042 DEBUG DEBUGログ
root: 2008-11-10 22:50:00,042 WARNING WARNINGログ
top.mid: 2008-11-10 22:50:00,042 DEBUG top.mid
top.mid: 2008-11-10 22:50:00,043 INFO infoログ
top.mid: 2008-11-10 22:50:00,043 WARNING warnログ


app.logへの出力
top.mid: 2008-11-10 22:50:00,043 WARNING warnログ


だいたい見れば分かるはず。
propagateってのは自分が受け取ったものを、上位のloggerにも通知するかの設定(通知する=1,しない=0)。何でもかんでも通知するとログが大爆発するので、記録方法によっては注意したほうが良いかも。
level=NOTSETってのはroot loggerの場合、全てを記録。その他のloggerの場合は、親のloggerの設定に従ってログります。
FileHandlerが使用するファイルは無い場合、fileConfigを呼んだ時点で勝手に作られる。
あと、サンプルだからFileHandlerを使ったけど、実際にはRotatingFileHandlerを使うケースのがほとんどのはず。

これ以上知りたいなら、ドキュメントを読みましょう。

0 件のコメント: