Pythonのlogging機能をさくっと使えるコピペ

2019/12/13

Python

t f B! P L
pythonのlogging機能について記事をいくつか読みました。

フォーマットについて
https://qiita.com/__init__/items/91e5841ed53d55a7895e

loggingとloggerの分け方
https://qiita.com/amedama/items/b856b2f30c2f38665701

ハンドラについて
https://python.civic-apps.com/logifle-logger/

私は今までprintでデバッグしていたのですが、printだといちいちコメントアウトを付けたり外したりするのがめんどくさいんですよね。
そこで↑の記事を読んでたどり着いたベストプラクティスがこちらです。

今日のベストプラクティス


from logging import getLogger, StreamHandler, Formatter, DEBUG, INFO

# ロガーオブジェクト
logger = getLogger(__name__)
# ログが複数回表示されるのを防止
logger.propagate = False
# ロガー自体のロギングレベル
logger.setLevel(DEBUG)

# ログを標準出力へ
handler = StreamHandler()
# ロギングのフォーマット
handler.setFormatter(Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# このハンドラのロギングレベル
handler.setLevel(DEBUG)
# ロガーにハンドラを追加
logger.addHandler(handler)

logger.debug('debug message') # 出る
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

# このハンドラのロギングレベルを変更
handler.setLevel(INFO)

logger.debug('debug message') # 出ない
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

handler.setLevelによるロギングレベルの制御

やりたかったのはこれです。
デバッグ時だけ表示したいログと、運用時にも残したいログがあります。
今まではデバッグ時はprintデバッグで、運用時にはコメントアウトするという頭悪いやり方をしてました。

ロガーにはロギングレベルがあり、基本的にハンドラにセットしたロギングレベルより”やばいもの”はすべて表示されるようになります。


こちらにある通り、やばさは
DEBUG<INFO<WARNING<ERROR<CRITICAL
なので、handler.setLevel(INFO)とした場合は、INFOから右側しか表示されません(DEBUGは表示されない)。
  • 開発版はhandler.setLevel(DEBUG)で作業
  • リリース版では、handler.setLevel(INFO)へ変更
としています。
これでリリース版をデバッグ調査する必要が生じた際も、一時的にhandler.setLevel(DEBUG)と書き直すだけで、すぐにデバッグを始められます。

ちなみに、handlerを接続したlogger自体(=根元)では、logger.setLevel(DEBUG)としています。
つまり、logger自体はDEBUGレベルのログも取得している。

loggerが取得したログを表示するhandler側でログレベルを再びセットすることで、レベル別の表示/非表示を簡単に制御できているわけです。

プレースホルダによるフォーマット

私は以下のようにしています。

# ロギングのフォーマット
handler.setFormatter(Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))

これが使えると一気にログメッセージが”それっぽく”見えるようになります。

使えるプレースホルダの名前は以下を参照。
https://docs.python.org/ja/3/library/logging.html#logrecord-attributes


今日のベストプラクティスはもう書いちゃったのでなし!

このブログを検索

QooQ