Python Logging の基本
Pythonのloggingモジュールは、アプリケーションの実行中に発生するイベントを追跡するための柔軟なメカニズムを提供します。ログメッセージをさまざまな宛先(コンソール、ファイル、ネットワークなど)に出力したり、重要度に応じてフィルタリングしたりすることができます。
主な利点:
-
デバッグの容易化: 問題発生時の状況把握に役立ちます。
-
運用管理の向上: 実行状況やエラーを記録し、監視や分析に利用できます。
-
柔軟な設定: ログの出力形式や出力先、重要度などを細かく制御できます。
基本的な構成要素:
-
Logger: ログメッセージを記録するオブジェクト。通常はモジュールごとに一つ作成します。
-
Handler: ログメッセージの出力先を定義するオブジェクト(例: コンソールに出力するStreamHandler、ファイルに出力するFileHandler)。
-
Formatter: ログメッセージの書式を定義するオブジェクト(例: タイムスタンプ、ログレベル、メッセージなどを含む形式)。
-
Level: ログメッセージの重要度を示す定数(DEBUG, INFO, WARNING, ERROR, CRITICALなど)。 基本的なログ出力関数:
Loggerオブジェクトを通じて、以下の関数でログメッセージを出力します。
-
logger.debug('デバッグ情報')
-
logger.info('通常の情報')
-
logger.warning('注意')
-
logger.error('エラー')
-
logger.critical('重大なエラー')
ログメッセージは、LoggerとHandlerに設定されたログレベルに基づいてフィルタリングされます。例えば、LoggerのレベルがINFOに設定されている場合、DEBUGレベルのメッセージは無視されます。
コマンド、オプション
Pythonのloggingモジュール自体に直接的なコマンドやオプションはありません。loggingの設定は主にPythonのコード内で行います。
ただし、loggingの設定方法にはいくつかの柔軟性があり、間接的にオプションのような振る舞いを実現できます。
設定方法の主な種類:
-
基本的な設定 (logging.basicConfig()): 簡単な設定を行うための関数。一度しか呼び出せません。
-
level: ルートロガーのログレベルを設定します(例: logging.DEBUG)。
-
filename: ログ出力先のファイル名を指定します。これを指定すると、コンソールへの出力は行われません。
-
filemode: ファイルを開くモードを指定します(デフォルトは 'a' (append))。
-
format: ログメッセージの書式文字列を指定します。
-
datefmt: 日付/時刻の書式文字列を指定します。 style: 書式指定のスタイル ('%', '{', '$') を指定します(デフォルトは '%')。
-
stream: ログ出力先のストリームオブジェクトを指定します(filename が指定されている場合は無視されます)。
-
高度な設定 (logging.config モジュール): 辞書形式や設定ファイルからより複雑なロギング設定を読み込むことができます。これにより、複数のLogger、Handler、Formatterを柔軟に構成できます。
書式指定文字列の例 (format オプション):
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
-
%(asctime)s: ログが発生した日時
-
%(name)s: ロガーの名前
-
%(levelname)s: ログレベル
-
%(message)s: ログメッセージ
使用例
以下に、基本的な使用例と、ファイルへの出力例を示します。
- 基本的な使用例 (コンソール出力):
import logging
# ロギングの基本的な設定 (INFOレベル以上のメッセージを表示)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# ロガーを取得 (現在のモジュール名がデフォルト)
logger = logging.getLogger(__name__)
logger.debug('これはデバッグメッセージです')
logger.info('これは通常の情報メッセージです')
logger.warning('これは警告メッセージです')
logger.error('これはエラーメッセージです')
logger.critical('これは重大なエラーメッセージです')
このコードを実行すると、INFOレベル以上のログメッセージがコンソールに出力されます。DEBUGレベルのメッセージは表示されません。
- ファイルへの出力例:
import logging
# ファイルへのロギング設定
logging.basicConfig(filename='app.log', level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# ロガーを取得
logger = logging.getLogger('my_app')
logger.debug('アプリケーションの起動')
try:
result = 10 / 0
except ZeroDivisionError:
logger.error('ゼロ除算エラーが発生しました', exc_info=True)
logger.info('処理が完了しました')
このコードを実行すると、DEBUGレベル以上のログメッセージが app.log ファイルに書き込まれます。exc_info=True を指定することで、例外に関する情報もログに出力できます。