python: ログを出力・記録するためのクラスであるloggingの使い方

Pythonで簡易的なスクリプトを作成していると、 print でなんでも済ませてしまいがちだが、後から何かしらにモジュール化して組み込むことや、スクリプトのままだとしても不要なログは消すなどの対応が後からとれるようにしたい。その時に利用できるのが logging モジュール。

logging の基本的な使い方

logging は利用を開始する前に basicConfig を利用して設定を行ってあげる必要がある。そのあと、 logging.info などレベルに応じた関数を呼び出してログを書き出す。例えば以下のような形。

import sys
import logging

logging.basicConfig(
	level=logging.INFO,
	format="%(asctime)s [%(levelname)s] %(message)s",
	handlers=[
		logging.FileHandler("test.log"),
		logging.StreamHandler(sys.stdout)
	]
)

# 呼び出す関数によってログのレベル(深刻度)設定が変わる
logging.info("This is a sample of INFO log")
logging.warning("This is a sample of WARNING log")
logging.critical("This is a sample of CRITICAL log")

ここでの設定値は以下。

  • level でどのレベル以上のログを出力対象とするか設定している。ここでは INFO 以上のログを出力する設定。
  • format でログの出力形式を設定。後述。
  • handlers でログをどこに出力するかを指定。ここでは debug.log というファイルと stdout すなわちコンソールの標準出力を指定している。

level について

logging で利用される level は以下の通り。上から強い順。

  • CRITICAL
  • ERROR
  • WARNING
  • INFO
  • DEBUG

basicConfig でlevelを弄るだけで、不要なログを出力しないようにレベルで制限を書けることができる。

format について

個人的にはそんなに弄るものでもないので、上で書いた内容を説明するだけにとどめる。指定の仕方は %(ここにキー)s という形式。少し特殊。
キーとして指定できるすべての内容を知りたい人はLogRecord属性 を参照。

  • asctime : “2022-08-02 12:34:56,789” というような形式。コンマ以降の数字はミリ秒。
  • levelname : その名の通りlevel。 INFO などがここに記される。
  • message : ログの内容。

handlers について

handlers はログをハンドルする人を指定する。ここではよく使うファイル出力とコンソール出力のみを記すが、指定できるハンドラは便利なハンドラで確認できる。意外と色々なことができる。

  • logging.FileHandler: その名の通りファイル出力を扱うハンドラ。引数にファイル名を指定する。
  • logging.StreamHandler : Streamへの出力を扱うハンドラ。大抵はコンソール出力用途で、 sys.stdoutsys.stderr を指定する。

大規模なプログラムにおけるログ

より大規模なプログラムになると、モジュール毎にログを出力したい時があるが、そういった場合には logging.getLogger を利用して名前付きのLoggerを利用することで対応ができる。

logger = logging.getLogger(__name__)

これ以降は通常の logging と同じように取り扱える。

logger.info("info log")

この場合はログがどこから来たものか判別するために %(module)s%(funcName)s などを利用する必要がるかもしれない。

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい