環境
- Windows 10
- Python 3.10.1
- VSCode
pythonでのロギング
基本的な書き方
- loggerオブジェクトの生成
- handlerオブジェクトの生成(どのようにログを出力するかを制御するオブジェクト)
- 出力するログレベルの設定
- ケースによって使い分ける(DEBUG,INFO,WARNING,ERROR,CRITICAL)
- handlerにセットされたログレベルよりレベルが低いログは出力されない
- 例えば、handlerにWARNINGのログレベルをセットすると、DEBUGやINFOのログは出力されない
- loggerオブジェクトにhandlerをセット
- 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 として求められた、ログメッセージ。 |
%(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について紹介しています。具体的には、基本的なログの出力方法とログのフォーマットの方法について説明しています。ぜひ参考にしてみてください。