nykergoto’s blog

機械学習とpythonをメインに

python で logging を止める

はじめに: 基本的なお作法

python の logging の話です。logging そのまま呼び出しもできるのですが若干やんちゃやで、ということが公式ドキュメントに書いています。

ロガーに名前をつけるときの良い習慣は、ロギングを使う各モジュールに、以下のように名付けられた、モジュールレベルロガーを使うことです: https://docs.python.org/ja/3/howto/logging.html#advanced-logging-tutorial

おとなしくガイドに則って, お行儀よく getLogger で名前を指定して logger を取得するようにしましょう。

from logging import getLogger

logger = getLogger(__name__)

# この段階ではコンソールには何も出ない
logger.info('foo')

Handler

  • logger を単に call しても何もおこならないのは logger 単体はログの管理をしているだけで、実際にファイルやコンソールに書き出す仕事は Handler インスタンスが行なっているからです。
  • Handler はいろいろと種類があるのですが普通使うのは StreamHandler(コンソール書き出し) と FileHandler(外部ファイルへの書き出し) が多いと思います。
  • この handler を logger に追加することで、logger → handler に情報伝達されます。たとえば StreamHandler であればログがコンソールに表示されるようになります。
from logging import StreamHandler

handler = StreamHandler()
logger.addHandler(handler)

Level

logging にはその重要度を定める level という概念があります。 logger と handler にはそれぞれ level を設定することができます。 logger は自分に設定されている level よりも高い log が call された時に handler を実行します。

handler にも level があり、呼びだされた level が自分に設定されている level よりも高いときに handler の method が呼び出されます。

# このハンドラが感知するのは INFO よりもレベルが高いもの (i.e. info / warning / error / critical) になる。 
handler.setLevel('INFO')

logger.info('foo') # この段階では logger のレベルが設定されていないので handler も動かない

# logger に level を設定すると動くようになる
logger.setLevel('INFO')
logger.info('foo') # foo

Logging を一時的に止めたい時

本題です。 logger.disabled = True にすると handler の呼び出しが止まります。一時的にログを止めたい時とか便利です。 level=NOTSET でも同じことになりますが, この場合前に設定していたレベルをどこかに覚えておかないと同じ状態に戻せないため disabled を使ったほうが便利です。

logger.disabled = True
logger.info('hoge') # なにもでない

logger.disabled = False
logger.info('piyo') # piyo