Python logging
Pythonでログを出力するためのモジュールです。printでも良いのですがloggingの方が便利機能が豊富に含まれています。
1 2 |
import logging logging.info("ログ出力内容") |
ログレベル
ログレベル | ラベル | 説明 |
---|---|---|
1 | CRITICAL | 実行が続けられないくらいの重大な障害 |
2 | ERROR | ある機能を実行できない位の局所的な問題 |
3 | WARNING | 想定外のことが起きて問題が発生しそうな状態 |
4 | INFO | 想定通り実行されているか確認するための情報出力 |
5 | DEBUG | デバッグする際に詳細な情報を出力する場合に使う。 |
辞書形式で出力する
こんな感じで辞書形式で設定しておけばまとめて確認できる上に何の情報が出力されているかわかるので後から見た時に非常に便利です。
1 2 3 4 |
logging.debug({ 'status': response.status, 'url': response.url, }) |
ロギングオブジェクト
1 2 3 4 5 6 7 |
from logging import getLogger,StreamHandler,DEBUG logger = getLogger(__name__) handler = StreamHandler() handler.setLevel(DEBUG) logger.setLevel(DEBUG) logger.addHandler(handler) # ロガーにハンドラーオブジェクトを指定 logger.debug("デバッグします。") |
ロギングオブジェクトはログ出力を命令するオブジェクトです。
__name__
Pythonファイルのモジュール名が入っています。(普通に実行すると「__main__」が入ります。)
StreamHandler()
実際にどうやってログの出力をするか操作しているオブジェクトです。Pythonの標準出力に出力するためのハンドラーになります。
logger.setLevel(DEBUG)
DEBUG以上のレベル(INFO、ERRORなど)を扱ってくださいとloggerに指定してます。
ログのフォーマット
自分の好きなようにログ出力のフォーマットをカスタマイズできる機能です。ハンドラーに対して設定します。
'%(levelname)s' | ログのレベル |
'%(asctime)s' | ログが出力された時間 |
'%(message)s' | メッセージ |
'%(filename)s' | ファイル名(注意点として、ログ出力先のファイル名ではなくログ出力を実行したコードのファイル名です。) |
1 2 3 4 |
from logging import Formatter formatter = Formatter('[%(levelname)s] %(filename)s %(asctime)s %(message)s') handler.setFormatter(formatter) logger.debug("デバッグします。") # [DEBUG] log.py 2023-06-18 10:49:19,061 デバッグします。 |
ファイル出力
1 2 3 |
from logging import getLogger,FileHandler,DEBUG handler = FileHandler('test.log') logger.debug("デバッグします。") |
FileHandlerモジュールを使うことでログをファイル名を指定してファイル出力することができます。
なお、デフォルトでは複数回実行した場合は上書きではなくファイルに追記されるようになっています。
ログレベルによるファイルの出し分け
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from logging import getLogger,FileHandler,DEBUG,ERROR logger = getLogger(__name__) handler = FileHandler('test.txt') logger.setLevel(DEBUG) handler.setLevel(DEBUG) logger.addHandler(handler) # ロガーにハンドラーオブジェクトを指定 from logging import Formatter formatter = Formatter('[%(levelname)s] %(filename)s %(asctime)s %(message)s') handler.setFormatter(formatter) logger.debug("デバッグします。") error_handler = FileHandler('error.txt') logger.setLevel(ERROR) logger.addHandler(error_handler) # ロガーにハンドラーオブジェクトを指定 logger.error("エラーです。") |
ログレベルごとに別々のハンドラーを作ってloggerにそれぞれ設定してあげることによってログファイルを出し分けることができます。
loggerのログレベルを低くしておいて、handlerのログレベルをファイルによって調整するという使い分けをすることがプロダクトレベルのコードを実装するうえで重要になってきます。
この記事へのコメントはありません。