Python の setLevel() でログ レベルを設定する


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

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


Pythonログインプログラムの機能

ロギングは、ソフトウェアの実行中にプログラムのフローを追跡するプロセスです。ただし、プログラムにログインを実装しないと、プログラムがクラッシュするたびに、問題の原因を見つけるのが困難になる可能性があります。

プログラムにログ記録を実装すると、問題の原因を簡単に見つけてすぐに修正できます。ソフトウェアのデバッグや開発時に非常に役立ちます。

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

Python の標準ライブラリには、logging と呼ばれる組み込みモジュールが用意されています。このモジュールは、プログラムのどの部分が実行されているか、何が問題の原因であるかを説明するステータス メッセージを出力ストリームまたはファイルに書き込みます。


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

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

ログ メッセージのレベルは次のとおりです。DEBUG、INFO、WARNING、ERROR、CRITICAL であり、CRITICAL が最も重要です。

ログレベル 説明する
デバッグ ソフトウェアのデバッグに使用されます。通常、詳細は問題が発生したときに提供されます。
情報 プログラム内のすべてが動作することを確認します。
警告 将来何らかの問題が発生する可能性があり、将来の問題を回避するために解決する必要があることを示すために使用されます。
エラー 重大な問題によりソフトウェアが特定の機能を実行できないことを示すために使用されます。
致命的 このレベルは、ソフトウェアを停止させる重大な問題を示します。

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


Python ロギング モジュールの setLevel() 関数を使用してロギング レベルを設定します。

setLevel(level)ロガーのしきい値を指定したレベルに設定する機能。指定されたレベル未満のログ メッセージは無視されますが、それより高い重大度のメッセージは、ロガーにサービスを提供する対応するハンドラーによって出力されます。

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

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

ロガーの作成時に、そのレベルが明示的に設定されていない場合、その親ロガーのレベルがロガーの有効レベルについてチェックされ、明示的に設定されたものを使用して設定されますsetLevel(level)親ロガーも有効なレベルに設定されていない場合は、その親ロガーがチェックされます。

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

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 ログ メッセージは取得されません。

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

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


要約する

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

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

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

おすすめ

転載: blog.csdn.net/fengqianlang/article/details/131584924