Python - loggingモジュール:ログ
初めに
Pythonでは、logging モジュールを使用してログを記録することができます。本記事はloggingモジュールの基本的な使い方をまとめています。
Index
loggingモジュールの基本
Python では、logging モジュールを使用してログを記録します。このモジュールは、ログメッセージのレベル、出力先、書式などを設定するための機能を提供します。
ログレベル
ログメッセージには、重要度を示すレベルが設定されます。デフォルトで用意されているレベルは以下のとおりです。
ログレベル | 説明 |
---|---|
DEBUG | デバッグログ |
INFO | 通常の動作に関する情報のログ |
WARNING | 潜在的な問題に関する警告のログ |
ERROR | エラーメッセージログ |
CRITICAL | 致命的なエラーログ |
通常はWARNING以上のログのみ表示されます。
logger, handler, filter, formatter
loggingモジュールは次の4つを使い、ログを記録、管理します。
部品 | 説明 |
---|---|
logger | ログメッセージの生成と送信を担当するオブジェクトgetLogger(name) 関数で名前を指定してロガーを取得するdebug() , info() , warning() , error() , critical() でそれぞれのレベルでログメッセージを記録する |
handler | ロガーから送信されたログメッセージを受け取り、出力先へ送信するオブジェクト コンソールに出力する StreamHandler が使用される |
filter | ロガーから送信されたログメッセージを検査し、出力するかどうかを決定するオブジェクト |
formatter | ログメッセージを最終的に出力される形式に変換するオブジェクト |
ログの記録
logging モジュールの logger オブジェクトを使用することで、ログを記録することができます。その際、ログレベルの設定ができます。
import logging logger = logging.getLogger(__name__) logger.debug("This is a debug message") logger.info("This is an info message") logger.warning("This is a warning message") logger.error("This is an error message") logger.critical("This is a critical message")
基本的な例文
from logging import getLogger, StreamHandler, Formatter # ロガーを取得 logger = getLogger(__name__) # ハンドラを作成 stream_handler = StreamHandler() # フォーマッタを作成 formatter = Formatter("%(asctime)s %(levelname)s %(message)s") # ハンドラにフォーマッタを設定 stream_handler.setFormatter(formatter) # ロガーにハンドラを追加 logger.addHandler(stream_handler) # ログメッセージを記録 logger.debug("This is a debug message") logger.info("This is an info message") logger.warning("This is a warning message") logger.error("This is an error message") logger.critical("This is a critical message")
(実行結果)
前述の通り、ログレベルWARNING以上のログのみ出力されます。
詳細の説明
setLebel()
logger, handlerには, setLebel()
関数が用意されています。これによりログメッセージの最低レベルを設定することができます。
コード | 説明 |
---|---|
logger.setLebel() |
そのロガーが生成するログメッセージの最低レベルを設定 |
handler.setLebel() |
そのハンドラが出力するログメッセージの最低レベルを設定 |
先ほど、ログレベルWARNING以上のログのみ出力が出力されると説明しましたが、これはデフォルトの logger.setLebel()
が WARNING に設定されているためです。
実際、先ほどのコードにlogger.setLebel()
を DEBUG に変更するコードを追加して実行してみます。
from logging import getLogger, StreamHandler, Formatter, DEBUG # ロガーを取得 logger = getLogger(__name__) # ロガーのログレベルを設定 logger.setLevel(DEBUG) # ハンドラを作成 stream_handler = StreamHandler() # フォーマッタを作成 formatter = Formatter("%(asctime)s %(levelname)s %(message)s") # ハンドラにフォーマッタを設定 stream_handler.setFormatter(formatter) # ロガーにハンドラを追加 logger.addHandler(stream_handler) # ログメッセージを記録 logger.debug("This is a debug message") logger.info("This is an info message") logger.warning("This is a warning message") logger.error("This is an error message") logger.critical("This is a critical message")
(実行結果)
これにさらにhandler.setLebel()
を ERROR に変更するコードを追加して実行してみます。
from logging import getLogger, StreamHandler, Formatter, DEBUG, ERROR # ロガーを取得 logger = getLogger(__name__) # ロガーのログレベルを設定 logger.setLevel(DEBUG) # ハンドラを作成 stream_handler = StreamHandler() # フォーマッタを作成 formatter = Formatter("%(asctime)s %(levelname)s %(message)s") # ハンドラにフォーマッタを設定 stream_handler.setFormatter(formatter) # ハンドラのログレベルを設定 stream_handler.setLevel(ERROR) # ロガーにハンドラを追加 logger.addHandler(stream_handler) # ログメッセージを記録 logger.debug("This is a debug message") logger.info("This is an info message") logger.warning("This is a warning message") logger.error("This is an error message") logger.critical("This is a critical message")
(実行結果)
ログレベル ERROR 未満のログは生成されていますが、handler で出力されないように設定されているため、上の実行結果になっています。
ログとして生成、出力されるには、logger, handler のログの最低レベルをどちらも満たしている必要があります。
ハンドラ
上記では、StreamHandlerを使い、ログ出力をしました。他のハンドラを用い、別の出力先をしていすることができます。
ハンドラ | 説明 |
---|---|
StreamHandler | 標準出力 (sys.stdout) にログメッセージを出力する デバッグや開発時に使用される |
FileHandler | 指定されたファイルにログメッセージを出力する |
RotatingFileHandler | 指定されたファイルにログメッセージを出力する ファイルサイズが大きくなった場合は、自動的にローテーションされる ログファイルのサイズを制限したい場合に使用される |
TimedRotatingFileHandler | 指定されたファイルにログメッセージを出力する 時間間隔で自動的にローテーションされる ログファイルを定期的にローテーションしたい場合に使用される |
SMTPHandler | SMTP サーバにログメッセージを送信する 重要なエラーメッセージをメールで通知したい場合に使用される |
HTTPHandler | HTTP サーバにログメッセージを送信する ログメッセージをWebサーバで収集したい場合に使用される |
他のハンドラについては、公式ドキュメントをご覧ください。