Python で setLevel() を使用してログ レベルを設定する

Namita Chaudhary 2023年6月21日
  1. Python でプログラムにログインする機能
  2. Python のログ メッセージのレベル
  3. Python Logging モジュールで setLevel() 関数を使用してログ レベルを設定する
  4. Python でのロギング ハンドラー
  5. まとめ
Python で setLevel() を使用してログ レベルを設定する

ロギングは、プログラマーの生活において非常に効率的なツールです。 プログラムの流れをよりよく理解できるだけでなく、プログラムの実行中に発生する可能性のあるエラーの可能性についても理解できます。

Python は、ロギングを容易にするために、標準ライブラリの一部として別の logging モジュールを提供します。 この記事では、ロギング setLevel と、それが Python でどのように機能するかについて説明します。

Python でプログラムにログインする機能

ロギングは、ソフトウェアの実行時にプログラムの流れを追跡するプロセスです。 ただし、プログラムにログを実装しないと、プログラムがクラッシュするたびに、発生した問題の原因を突き止めるのが難しくなります。

プログラムにロギングを実装すると、問題の根本を簡単に見つけて、すぐに解決できます。 ソフトウェアのデバッグおよび開発中に非常に役立ちます。

ソフトウェアの問題を見つけるために print ステートメントを使用することがあります。 単純なスクリプトの問題は印刷で解決できますが、大規模で複雑なソフトウェアには適していません。

Python は標準ライブラリから logging と呼ばれる組み込みモジュールを提供します。このモジュールは、プログラムのどの部分が実行され、どのような問題が発生したかについて、ステータス メッセージを任意の出力ストリームまたはファイルに書き込みます。

Python のログ メッセージのレベル

Python の logging モジュールには、重要度に基づいてさまざまなステータス/ログ メッセージ レベルがあります。 したがって、ログ メッセージのレベルによって、そのログ メッセージの重要性がわかります。

ログ メッセージのさまざまなレベルは次のとおりです。DEBUGINFOWARNINGERROR、および CRITICAL で、CRITICAL が最も重要です。

ログレベル 説明
DEBUG これは、ソフトウェアでのデバッグ目的で使用されます。 通常、問題が発生したときに詳細な情報を提供します。
INFO プログラム内ですべてが正常に機能することを保証します。
WARNING 将来何らかの問題が発生する可能性があり、将来の問題を回避するために解決する必要があることを示すために使用されます。
ERROR 重大な問題のためにソフトウェアが特定の機能を実行できなかったことを示すために使用されます。
CRITICAL このレベルは、ソフトウェアの停止につながる重大な問題を意味します。

エラーが発生したときに適切なメッセージを適切なタイミングで表示できるように、これらすべてのレベルがハンドラーまたはロガーに対して設定されます。 ロギング レベルは重要度に基づいて上で説明されています。最初のレベルが最も重要度が低く、最後の (CRITICAL レベル) が最も重要度が高いです。

Python Logging モジュールで setLevel() 関数を使用してログ レベルを設定する

setLevel(level) 関数は、ロガーのしきい値を指定されたレベルに設定するために使用されます。 指定されたレベルよりも重大度の低いログ メッセージは無視されますが、重大度の高いメッセージは、ロガーにサービスを提供する対応するハンドラーによって発行されます。

Python でのロギングには、有効レベルの概念があります。 最初に、ロガーが作成されると、レベル NOTSET に設定されます。

ただし、この NOTSET は有効なレベルではありません。 有効なレベルは、setLevel(level) を使用して明示的に設定されたレベルです。

ロガーが作成されるとき、そのレベルが明示的に設定されていない場合、その親ロガーのレベルが調べられて、ロガーの有効なレベルが取得されます。これは、setLevel(level) を使用して明示的に設定されていたはずです。 親ロガーも有効なレベルに設定されていない場合、その親ロガーがチェックされます。

このプロセスは、NOTSET 以外のレベルが見つかるか、ルートに到達するまで続きます。 ルート ロガーは、デフォルト レベルの WARNING に設定されています。 したがって、このような場合、ルートのデフォルト レベルが有効なレベルと見なされます。

それでは、いくつかのコード例を使用して setLevel(level) の使用法を見てみましょう。

import logging

logging.debug("Debug message")
logging.info("Info message")
logging.warning("Warning message")
logging.error("Error message")
logging.critical("Critical message")

出力:

WARNING:root:Warning message
ERROR:root:Error message
CRITICAL:root:Critical message

上記の出力に見られるように、他のロガーやその親が指定されていないため、ルート ロガーのデフォルト レベル WARNING が有効なレベルと見なされているため、WARNINGERROR、および CRITICAL メッセージのみが出力されます。 したがって、レベル WARNING 以降のすべてのメッセージが出力され、重要度の低いメッセージは無視されます。

ロガーが実効レベルを親のレベルと見なす例を見てみましょう。

import logging

parent_logger = logging.getLogger("parent")
parent_logger.setLevel(4)

child_logger = logging.getLogger("parent.child")

print(parent_logger.getEffectiveLevel())
print(child_logger.getEffectiveLevel())

出力:

4
4

ご覧のとおり、child_logger は有効レベルに設定されていないため、parent_logger のレベルが有効レベルとして使用されます。

Python でのロギング ハンドラー

Python のハンドラーは、適切なログ メッセージをハンドラーの指定された宛先に記録する役割を持つオブジェクトです。 これらのハンドラーは、ロガーのようにも機能します。 ロガーにハンドラーが設定されていない場合、その祖先でハンドラーが検索されます。

ロギングでのハンドラーの使用法を見てみましょう。

import logging

logger = logging.getLogger("example")
logger.setLevel(logging.INFO)

fileHandler = logging.FileHandler("p1.log")
fileHandler.setLevel(logging.INFO)

chl = logging.StreamHandler()
chl.setLevel(logging.INFO)

logger.addHandler(fileHandler)
logger.addHandler(chl)

logger.info("Information")

出力:

Information

上記のコードでは、fileHandlerchl の 2つのハンドラを作成しました。 fileHandler はレコードを p1.log ファイルに送信し、chl ハンドラはレコードをストリームに送信します。

ただし、ストリームが指定されていない場合は、sys.stderr が使用されます。 最終的に、ハンドラーは addHandler を使用してロガーに追加されます。

ここで、なぜレベルを 2 回設定したのか不思議に思うはずです。1つはロガー用で、もう 1つはハンドラー用です。 ハンドラーの setLevel() を削除すると、メッセージのすべてのレベルのフィルタリングがロガーに委ねられます。

ただし、ハンドラーとロガーのレベルを設定すると、別のシナリオになります。 ロガーは、レベルに基づいてメッセージをフィルタリングする最初のものです。 したがって、ロガーを WARNINGINFO、またはそれ以上のレベルに設定し、ハンドラーを DEBUG に設定すると、そもそもロガーが無視するため、DEBUG ログ メッセージを受信しません。

同様に、ロガーを DEBUG に設定し、ハンドラーを INFO などのより高いレベルに設定すると、ハンドラーがそれらを拒否するため、DEBUG メッセージも受信しません。 ロガーが承認しても、ハンドラーはそれを拒否します (INFO > DEBUG のため)。

したがって、ロガーとハンドラーのレベルを設定する際には、ソフトウェアが適切に動作するように十分注意する必要があります。

まとめ

この記事では、ロギング setLevel() と、それが Python でどのように機能するかについて説明しました。

ロギングは、プログラムの流れを記録してエラーの可能性を見つけることにより、ソフトウェアまたはプログラムのコードを管理するための非常に効率的なツールです。 Python でのログ記録では、重要度に基づいてさまざまなログ メッセージにさまざまなレベルを設定します。

これらのレベルはすべて、この記事で詳しく説明されている setLevel を使用して設定されます。

関連記事 - Python Logging