Python で setLevel() を使用してログ レベルを設定する
- Python でプログラムにログインする機能
- Python のログ メッセージのレベル
-
Python Logging モジュールで
setLevel()
関数を使用してログ レベルを設定する - Python でのロギング ハンドラー
- まとめ
ロギングは、プログラマーの生活において非常に効率的なツールです。 プログラムの流れをよりよく理解できるだけでなく、プログラムの実行中に発生する可能性のあるエラーの可能性についても理解できます。
Python は、ロギングを容易にするために、標準ライブラリの一部として別の logging
モジュールを提供します。 この記事では、ロギング setLevel
と、それが Python でどのように機能するかについて説明します。
Python でプログラムにログインする機能
ロギングは、ソフトウェアの実行時にプログラムの流れを追跡するプロセスです。 ただし、プログラムにログを実装しないと、プログラムがクラッシュするたびに、発生した問題の原因を突き止めるのが難しくなります。
プログラムにロギングを実装すると、問題の根本を簡単に見つけて、すぐに解決できます。 ソフトウェアのデバッグおよび開発中に非常に役立ちます。
ソフトウェアの問題を見つけるために print
ステートメントを使用することがあります。 単純なスクリプトの問題は印刷で解決できますが、大規模で複雑なソフトウェアには適していません。
Python は標準ライブラリから logging
と呼ばれる組み込みモジュールを提供します。このモジュールは、プログラムのどの部分が実行され、どのような問題が発生したかについて、ステータス メッセージを任意の出力ストリームまたはファイルに書き込みます。
Python のログ メッセージのレベル
Python の logging
モジュールには、重要度に基づいてさまざまなステータス/ログ メッセージ レベルがあります。 したがって、ログ メッセージのレベルによって、そのログ メッセージの重要性がわかります。
ログ メッセージのさまざまなレベルは次のとおりです。DEBUG
、INFO
、WARNING
、ERROR
、および 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
が有効なレベルと見なされているため、WARNING
、ERROR
、および 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
上記のコードでは、fileHandler
と chl
の 2つのハンドラを作成しました。 fileHandler
はレコードを p1.log
ファイルに送信し、chl
ハンドラはレコードをストリームに送信します。
ただし、ストリームが指定されていない場合は、sys.stderr
が使用されます。 最終的に、ハンドラーは addHandler
を使用してロガーに追加されます。
ここで、なぜレベルを 2 回設定したのか不思議に思うはずです。1つはロガー用で、もう 1つはハンドラー用です。 ハンドラーの setLevel()
を削除すると、メッセージのすべてのレベルのフィルタリングがロガーに委ねられます。
ただし、ハンドラーとロガーのレベルを設定すると、別のシナリオになります。 ロガーは、レベルに基づいてメッセージをフィルタリングする最初のものです。 したがって、ロガーを WARNING
、INFO
、またはそれ以上のレベルに設定し、ハンドラーを DEBUG
に設定すると、そもそもロガーが無視するため、DEBUG
ログ メッセージを受信しません。
同様に、ロガーを DEBUG
に設定し、ハンドラーを INFO
などのより高いレベルに設定すると、ハンドラーがそれらを拒否するため、DEBUG
メッセージも受信しません。 ロガーが承認しても、ハンドラーはそれを拒否します (INFO
> DEBUG
のため)。
したがって、ロガーとハンドラーのレベルを設定する際には、ソフトウェアが適切に動作するように十分注意する必要があります。
まとめ
この記事では、ロギング setLevel()
と、それが Python でどのように機能するかについて説明しました。
ロギングは、プログラムの流れを記録してエラーの可能性を見つけることにより、ソフトウェアまたはプログラムのコードを管理するための非常に効率的なツールです。 Python でのログ記録では、重要度に基づいてさまざまなログ メッセージにさまざまなレベルを設定します。
これらのレベルはすべて、この記事で詳しく説明されている setLevel
を使用して設定されます。