Masayan tech blog.

  1. ブログ記事一覧>
  2. Pythonでいい感じのロギングするためのTips

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

公開日

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

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)

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

https://docs.python.org/ja/3/library/logging.html?highlight=funcname

フォーマット

説明

%(asctime)s

ログの出力時刻

%(created)f

ログ出力時刻(time.time()によって返される形式)

%(filename)s

pathname のファイル名部分。

%(funcName)s

ロギングの呼び出しを含む関数の名前。

%(levelname)s

メッセージのための文字のロギングレベル (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)。

%(levelno)s

メッセージのための数値のロギングレベル (DEBUG, INFO, WARNING, ERROR, CRITICAL)。

%(lineno)d

ロギングの呼び出しが発せられたソース行番号 (利用できる場合のみ)。

%(message)s

msg % args として求められた、ログメッセージ。
Formatter.format が呼び出されたときに設定されます。

%(module)s

モジュール (filename の名前部分)。

%(msecs)d

LogRecord が生成された時刻のミリ秒部分

%(name)s

ロギングに使われたロガーの名前。

%(pathname)s

ロギングの呼び出しが発せられたファイルの完全なパス名 (利用できる場合のみ)。

%(process)d

プロセス ID (利用可能な場合のみ)。

%(processName)s

プロセス名 (利用可能な場合のみ)。

%(relativeCreated)d

logging モジュールが読み込まれた時刻に対する、LogRecord が生成された時刻を、ミリ秒で表したもの。

%(thread)d

スレッド ID (利用可能な場合のみ)。

%(threadName)s

スレッド名 (利用可能な場合のみ)。

まとめ

いかがでしたでしょうか。本記事では、Pythonでいい感じのロギングするためのTipsについて紹介しています。具体的には、基本的なログの出力方法とログのフォーマットの方法について説明しています。ぜひ参考にしてみてください。