Pythonでロギングを使う(logging)
この記事ではPythonのloggingモジュールについて解説します。ログレベル、ハンドラ、フォーマッタの設定方法、そして様々なユースケースでの実践的な使用方法を説明します。
目次
基本的なロギング
Pythonのloggingモジュールを使うと、アプリケーションの実行状況を記録できます。最も基本的な使い方は以下の通りです。
import logging
logging.basicConfig(level=logging.INFO)
logging.info('これはインフォメーションレベルのログメッセージです')
logging.warning('これはワーニングレベルのログメッセージです')
logging.error('これはエラーレベルのログメッセージです')
basicConfig()関数でログレベルを設定します。ログレベルは、INFO, WARNING, ERROR, CRITICALなどがあります。デフォルトではWARNINGレベル以上がコンソールに出力されます。
ログレベル
ログレベルは、ログメッセージの重要度を表します。ログレベルは以下の通りです。 DEBUG: 詳細なデバッグ情報 INFO: プログラムの実行状況 WARNING: 問題が発生する可能性がある状況 ERROR: エラーが発生した状況 CRITICAL: システムに深刻なエラーが発生した状況
ログレベルを設定することで、出力するログメッセージを制御できます。
ハンドラ
ハンドラは、ログメッセージを出力する先を指定します。コンソール出力、ファイル出力など様々なハンドラがあります。
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug('これはデバッグレベルのログメッセージです')
上記の例では、StreamHandlerを使ってコンソールに出力しています。Formatterを使ってログメッセージのフォーマットも設定できます。
フォーマッタ
フォーマッタは、ログメッセージのフォーマットを指定します。%(asctime)s、%(name)s、%(levelname)s、%(message)sなどのフォーマット指定子が使えます。
import logging
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# ... (ハンドラの設定など)
ファイルへのログ出力
FileHandlerを使うと、ログメッセージをファイルに出力できます。
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('mylog.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('これはファイルに出力されるログメッセージです')
mylog.logというファイルにログが出力されます。
複数のハンドラ
複数のハンドラを追加することで、ログメッセージを複数の出力先に送信できます。
import logging
logger = logging.getLogger(__name__)
# ... (ハンドラの設定)
logger.addHandler(handler1)
logger.addHandler(handler2)
# ...
ロガーの階層構造
loggingモジュールはロガーの階層構造を持っています。親ロガーと子ロガーの関係で、ログ出力の制御ができます。
import logging
logger1 = logging.getLogger('parent')
logger2 = logging.getLogger('parent.child')
logger1.warning('親ロガーのメッセージ')
logger2.warning('子ロガーのメッセージ')
子ロガーは親ロガーの設定を継承します。
実践的な例
より複雑なロギングの設定例です。
import logging
import os
log_file = os.path.join(os.getcwd(), 'my_app.log')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# create error file handler and set level to error
file_handler_error = logging.FileHandler(log_file, 'w')
file_handler_error.setLevel(logging.ERROR)
formatter_error = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler_error.setFormatter(formatter_error)
logger.addHandler(file_handler_error)
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')
この例では、コンソールとファイルの両方にログを出力し、エラーレベル以上のログは別ファイルに出力します。
関連記事
- Pythonでtry-except文による例外処理
- Pythonでロギングを使う(logging)
- Pythonでファイルに書き込む(write, writelines)
- Pythonでファイルを読み込む(read, readline, readlines)
- Pythonでファイル・ディレクトリの存在確認(os.path.exists, os.path.isfile, os.path.isdir)
- Pythonでファイル・ディレクトリの操作(os, shutil, pathlib)
- Pythonで外部コマンドを実行(os.system, subprocess)
- Pythonでwith文によるリソース管理
- Pythonでファイルを開く・閉じる(open, close)
- Pythonでファイルを追記モードで開く