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.stdout
かsys.stderr
を指定する。
大規模なプログラムにおけるログ
より大規模なプログラムになると、モジュール毎にログを出力したい時があるが、そういった場合には logging.getLogger
を利用して名前付きのLoggerを利用することで対応ができる。
logger = logging.getLogger(__name__)
これ以降は通常の logging
と同じように取り扱える。
logger.info("info log")
この場合はログがどこから来たものか判別するために %(module)s
や %(funcName)s
などを利用する必要がるかもしれない。
コメント
コメントを投稿