【Python】ログ出力について理解する

python-logo Python

Pythonでログ出力を行う場合、loggingライブラリを利用する。

自分しか使わない簡易スクリプトなどであれば特に気にする必要がないが、
複数人で開発する場合やログ出力をしっかり設定しておきたい場合は、細かいところまで理解しておく必要がある。

特に作り込みたいわけでなければprintで何も問題はない。

loggingで提供されている機能

loggingには提供されている機能が4つ存在する。

Loggerコードの中で記述するためのもの
Handlerログをどこに出力するか
Filterどのログを出力するかの細かい設定
Formatterログをどんな見た目で出力するか

この機能を理解して使いこなすことで、
「何のログをどんな時にどんな条件でどこに出力するのか」
ということをコントロールすることができる。

Logger

簡単にいうと、ソースコード上で「ここでログ出力したい」と思った時にこれを使う。

例:

logger.info('INFOログを出力する')

Handler

ハンドラでは「どのログレベルをどこに出力するか」をコントロールする。

例えば

  • infoログは用意したログファイルに書き込む
  • errorログは標準出力に出す

のようなことを行いたい場合、2つのハンドラを用意する必要がある。

Filter

フィルタは「こういう条件に一致した場合のログのみ出力する」などの細かい設定を行う。

使い所で言えば、個人情報などセキュリティ的にログに出したくない情報をはじく場合が考えられる。

Formatter

フォーマッタはその名の通りログ出力するフォーマットを決定する。

日付 ファイル名 [ログレベル] ログ内容

という具合で、どんなレイアウトでログを出すか決めることができる。

ログの設定方法

ログの設定方法は3通りの方法が存在する。

  1. ソースコード上でログを利用する前に設定用のコードを書く
  2. ログの設定ファイルを作成して読み込む(fileConfig()を利用する)
  3. ログの設定情報(辞書形式)を作成して読み込む(dictConfig()を利用する)

1の方法が一番手っ取り早いが、推奨されているのは3の方法。

なのでここでは3の方法で解説する。

公式ドキュメントで紹介されているのは
「yamlファイルで設定記述→辞書として読み込み→dictConfig()で設定」
という流れである。

yamlに記載すべき内容は下記に細かく書かれている。

logging.config --- ロギングの環境設定 — Python 3.9.4 ドキュメント

コード

ログ設定ファイル「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にすれば良い。

詳しくは下記を参考にすると良い。

logging.handlers --- ロギングハンドラ — Python 3.10.0b2 ドキュメント

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:ログ出力のフォーマットを決めるもの
  • 設定の流れ
    1. yamlファイルで設定記述
    2. yaml.safe_load()を使って辞書として読み込み
    3. dictConfig()を使って辞書型のデータからloggerを設定
タイトルとURLをコピーしました