Pythonのロギングは階層構造になっています。大元のrootロガーがあって、それの下にユーザが作成したロガーが存在する、というイメージです。

ロギングの重要ポイント

ルートの logging を汚さないよう、 getLogger でloggerオブジェクトを作り、ロギングを行うことが望ましい。また、コード中で誤って logging を汚さないように下記の良い例のようにimportを工夫すると良い。

# 良くない例
import logging
logging.debug('this is bad logging')

# 良い例
from logging import getLogger
logger = getLogger(__name__)
logger.debug('this is good logging')

ログレベルについて

loggingにはログレベルが設定でき、 setLevel によりどのログレベルまで表示を行うかを制御することが可能。ログレベルには、 DEBUG, INFO, WARNING, ERROR, CRITICAL の5つがあり、ユーザーが任意に指定する必要がある。

from logging import getLogger, INFO
logger = getLogger(__name__)
logger.setLevel(INFO) # この場合、INFO以上のログが出力。つまり、DEBUG以外は出力される

フォーマットについて

loggingにはフォーマットも追加でき、 setFormatter によりログに日付や関数、ログレベルの情報など様々な詳細情報を出力できるようになる。

from logging import getLogger, Formatter
logger = getLogger(__name__)
format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.setFormatter(format) # loggerにフォーマットを適用

ハンドラーの設定

logを出力するためには、ハンドラーを作成する必要がある。 StreamHandler はコンソール出力用、 FileHandler はログファイル出力用に設定する。

from logging import getLogger, StreamHandler, FileHandler, Formatter, INFO, ERROR
logger = getLogger(__name__)
logger.setLevel(INFO)

# StreamHandlerの設定
ch = StreamHandler()
ch.setLevel(INFO)
ch_formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.addHandler(ch) # StreamHandlerの追加

# FileHandlerの設定
fh = FileHandler('log/test.log') # 引数には出力ファイルのパスを指定
fh.setLevel(ERROR)
fh_formatter = Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(name)s - %(funcName)s - %(message)s')
logger.addHandler(fh) # FileHandlerの追加

以上がPythonのロギングの基本的な使い方になります。詳細な情報や高度な使い方については公式ドキュメンテーションを参照してください。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です