今回は、Pythonのloggingモジュールでログのレベルを設定する方法についてご紹介します。
Pythonのloggingモジュールとは
Pythonのloggingモジュールは、プログラムの動作状況やエラー情報などを出力するための標準ライブラリです。
開発や運用において非常に便利で、ログを残すことで問題の原因特定や進捗確認を容易にします。
ログにはログレベルという優先度を示す概念があり、これを活用することで必要なメッセージのみを抽出したり、出力先を振り分けたりできます。
ログレベルを設定する方法
ログレベルとは、ログメッセージの重要度を表す仕組みです。
Pythonのloggingモジュールには、DEBUG、INFO、WARNING、ERROR、CRITICALの5種類が標準で用意されています。
ログレベルは整数値で管理されており、設定した閾値以上の重要度を持つログのみが出力されます。
ロガーでのレベル設定
ロガーとはログを生成する主体で、logging.getLogger()で取得します。
取得したロガーはsetLevel()によってログレベルを設定できます。
たとえば以下のように、ロガーを作成してDEBUG以上のログを受け付ける設定を行います。
1 2 3 4 |
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) |
ハンドラでのレベル設定
ハンドラとは、ログを実際にどこへ出力するかを管理するクラスです。
console(標準出力)向けやファイル向けなど、複数のハンドラを追加できます。
ハンドラにもsetLevel()があるため、ロガー側とハンドラ側の両方でログレベルを設定する点が重要です。
例えば、コンソールにはDEBUG以上を出力し、ファイルにはWARNING以上のみを出力するといった使い分けが可能です。
loggingの基本的な使い方例
basicConfigを使った簡易設定
loggingモジュールのbasicConfig()を使うと、簡単にログレベルやフォーマットを設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import logging logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s' ) logging.debug("これはデバッグメッセージです") logging.info("これは情報メッセージです") logging.warning("これは警告メッセージです") logging.error("これはエラーメッセージです") logging.critical("これは致命的なメッセージです") |
上記の例では、DEBUGレベル以上の全てのメッセージがコンソールに出力されます。
実行すると、下記のようなログが表示されます。
2025-02-18 12:00:00 – DEBUG – これはデバッグメッセージです
2025-02-18 12:00:00 – INFO – これは情報メッセージです
2025-02-18 12:00:00 – WARNING – これは警告メッセージです
2025-02-18 12:00:00 – ERROR – これはエラーメッセージです
2025-02-18 12:00:00 – CRITICAL – これは致命的なメッセージです
カスタムロガーと複数ハンドラを用いた設定
もう少し細かく制御したい場合は、ロガーとハンドラを個別に設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import logging # カスタムロガーを作成 logger = logging.getLogger("my_app") logger.setLevel(logging.DEBUG) # コンソール用ハンドラの設定(DEBUG以上を出力) console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(console_formatter) # ファイル用ハンドラの設定(WARNING以上を記録) file_handler = logging.FileHandler('app.log', encoding='utf-8') file_handler.setLevel(logging.WARNING) file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_formatter) # ハンドラをロガーに追加 logger.addHandler(console_handler) logger.addHandler(file_handler) # ログ出力 logger.debug("Debugメッセージ: 詳細な情報") logger.info("Infoメッセージ: 一般情報") logger.warning("Warningメッセージ: 注意が必要") logger.error("Errorメッセージ: エラー発生") logger.critical("Criticalメッセージ: 致命的エラー") |
コンソールにはDEBUG以上の全てのログが表示されますが、app.logファイルにはWARNING以上のログのみが出力されます。
よくあるエラーと対処法
loggingモジュールを利用する際には、いくつかのエラーや問題に遭遇する場合があります。
- basicConfig()の複数回呼び出しによる設定無視:最初の呼び出しのみが有効で、2回目以降の呼び出しは無視されるので注意が必要です。
- ハンドラの重複追加:同じロガーに複数回ハンドラを追加すると、ログが重複出力されることがあります。不要な重複を避けるため、ハンドラ追加の箇所は一度だけにしてください。
- FileHandlerでのファイルパスエラー:指定したパスが存在しないときや権限が不足している場合、ファイルの作成・書き込みに失敗することがあります。
これらを把握したうえで、ロガーとハンドラの設定を適切に行うことが大切です。
まとめ
Pythonのloggingモジュールを活用すれば、開発や運用において重要なログを管理しやすくなります。
ロガーとハンドラの両面でレベル設定を行うことで、目的に応じた適切なログを効率よく出力できます。
複数の設定方法やよくあるエラーを把握しながら、最適なログ設計を行ってみてください。