Pythonでいい感じのロギングするためのTips

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

pythonでのロギング

基本的な書き方

  1. loggerオブジェクトの生成
  2. handlerオブジェクトの生成(どのようにログを出力するかを制御するオブジェクト)
  3. 出力するログレベルの設定
    1. ケースによって使い分ける(DEBUG,INFO,WARNING,ERROR,CRITICAL)
    2. handlerにセットされたログレベルよりレベルが低いログは出力されない
    3. 例えば、handlerにWARNINGのログレベルをセットすると、DEBUGやINFOのログは出力されない
  4. loggerオブジェクトにhandlerをセット
  5. logの出力
    Logger.exception() は Logger.error() と似たログメッセージを作成するが、Logger.exception()を使用すると、スタックトレースを一緒にダンプしてくれる
from logging import DEBUG, Formatter, StreamHandler, getLogger

logger = getLogger(__name__)
handler = StreamHandler()  # 標準出力

handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.debug("debug log")

// "debug log"

標準出力

標準出力の場合は、StreamHandlerを指定してhandlerオブジェクトを生成する

handler = StreamHandler()  # 標準出力

ファイルへの出力

特定のfileへ出力したい場合は、FileHandlerを指定してhandlerオブジェクトを生成する

handler = FileHandler("logs/log.txt" ,encoding='utf-8')  # ファイルへの出力

ログのフォーマット

  • 上記だけだと、ログがそのままコンソールあるいはファイルに出力されるだけで少しみづらい。
  • そこでFormatterを使用してログを整形する
formatter = Formatter("[%(asctime)s] : %(levelname)s - %(message)s - (%(filename)s)")
handler.setFormatter(formatter)

logger.debug("debug log")

// [2022-02-27 10:38:14,488] : DEBUG - debug log - (inspect.py)

ログ出力の際、ファイル名や出力時刻等の情報をフォーマット文字列として埋め込むことができる

logging --- Python 用ロギング機能 — Python 3.10.0b2 ドキュメント
フォーマット説明
%(asctime)sログの出力時刻
%(created)fログ出力時刻(time.time()によって返される形式)
%(filename)spathname のファイル名部分。
%(funcName)sロギングの呼び出しを含む関数の名前。
%(levelname)sメッセージのための文字のロギングレベル (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)。
%(levelno)sメッセージのための数値のロギングレベル (DEBUG, INFO, WARNING, ERROR, CRITICAL)。
%(lineno)dロギングの呼び出しが発せられたソース行番号 (利用できる場合のみ)。
%(message)smsg % args として求められた、ログメッセージ。
Formatter.format が呼び出されたときに設定されます。
%(module)sモジュール (filename の名前部分)。
%(msecs)dLogRecord が生成された時刻のミリ秒部分
%(name)sロギングに使われたロガーの名前。
%(pathname)sロギングの呼び出しが発せられたファイルの完全なパス名 (利用できる場合のみ)。
%(process)dプロセス ID (利用可能な場合のみ)。
%(processName)sプロセス名 (利用可能な場合のみ)。
%(relativeCreated)dlogging モジュールが読み込まれた時刻に対する、LogRecord が生成された時刻を、ミリ秒で表したもの。
%(thread)dスレッド ID (利用可能な場合のみ)。
%(threadName)sスレッド名 (利用可能な場合のみ)。

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/08/04 17:32時点)
タイトルとURLをコピーしました