Pythonでログ出力を行う場合、loggingライブラリを利用する。
自分しか使わない簡易スクリプトなどであれば特に気にする必要がないが、
複数人で開発する場合やログ出力をしっかり設定しておきたい場合は、細かいところまで理解しておく必要がある。
特に作り込みたいわけでなければprintで何も問題はない。
loggingで提供されている機能
loggingには提供されている機能が4つ存在する。
Logger | コードの中で記述するためのもの |
Handler | ログをどこに出力するか |
Filter | どのログを出力するかの細かい設定 |
Formatter | ログをどんな見た目で出力するか |
この機能を理解して使いこなすことで、
「何のログをどんな時にどんな条件でどこに出力するのか」
ということをコントロールすることができる。
Logger
簡単にいうと、ソースコード上で「ここでログ出力したい」と思った時にこれを使う。
例:
logger.info('INFOログを出力する')
Handler
ハンドラでは「どのログレベルをどこに出力するか」をコントロールする。
例えば
- infoログは用意したログファイルに書き込む
- errorログは標準出力に出す
のようなことを行いたい場合、2つのハンドラを用意する必要がある。
Filter
フィルタは「こういう条件に一致した場合のログのみ出力する」などの細かい設定を行う。
使い所で言えば、個人情報などセキュリティ的にログに出したくない情報をはじく場合が考えられる。
Formatter
フォーマッタはその名の通りログ出力するフォーマットを決定する。
日付 ファイル名 [ログレベル] ログ内容
という具合で、どんなレイアウトでログを出すか決めることができる。
ログの設定方法
ログの設定方法は3通りの方法が存在する。
- ソースコード上でログを利用する前に設定用のコードを書く
- ログの設定ファイルを作成して読み込む(
fileConfig()
を利用する) - ログの設定情報(辞書形式)を作成して読み込む(
dictConfig()
を利用する)
1の方法が一番手っ取り早いが、推奨されているのは3の方法。
なのでここでは3の方法で解説する。
公式ドキュメントで紹介されているのは
「yamlファイルで設定記述→辞書として読み込み→dictConfig()
で設定」
という流れである。
yamlに記載すべき内容は下記に細かく書かれている。
コード
ログ設定ファイル「logsetting.yml」
version: 1
formatters:
# 基本のログフォーマット(simpleという名前のフォーマッタを定義)
simple:
format: "%(asctime)s %(name)s %(levelname)s %(message)s"
handlers:
# ログファイルを出力する設定(fileという名前のハンドラを定義)
file:
class: logging.FileHandler
level: INFO
formatter: simple # 上で定義したフォーマット「simple」を利用する
filename: "./default.log" # このファイルにログが出力される
loggers:
# my_loggerという名前のloggerを定義
my_logger:
level: INFO
handlers: [file] # 上で定義したハンドラを参照
propagate: no
- Formatterを定義
- それを参照したHandlerを定義
- それを参照したLoggerを定義
日付によってログローテーションを行いたい場合は、handlersにてクラス指定をlogging.handlers.TimedRotatingFileHandler
にすれば良い。
詳しくは下記を参考にすると良い。
Loggerの使用方法
プログラム上ではyml定義したLoggerを指定して呼び出す。
import logging
import logging.config
with open('./logsetting.yml', 'r') as file:
# yaml.safe_load() でymlに記述した項目を辞書形式で取り出し
# dictConfig()によって設定
logging.config.dictConfig(yaml.safe_load(file))
logger = logging.getLogger('my_logger') # my_logger として定義しているロガーを利用
logging.info('hoge') # default.log というファイルに「hoge」が出力される
まとめ
- Logger:ログに関する設定が全て詰め込まれたもの
- Hanlder:ログをどこに出力するか決めるもの
- Filter:ログの出力条件を決めるもの
- Formatter:ログ出力のフォーマットを決めるもの
- 設定の流れ
- yamlファイルで設定記述
yaml.safe_load()
を使って辞書として読み込みdictConfig()
を使って辞書型のデータからloggerを設定