Python グローバル ロガー
このチュートリアルでは、ロギング、そのさまざまなレベル、および Python での重要性について紹介します。 次に、Python logging
モジュールをグローバルに使用する方法を学びます。
ロギングの概要と Python におけるその重要性
ロギングは、ソフトウェアの実行中に発生するイベントを追跡する方法です。 ソフトウェア開発者は、ログ呼び出しを追加して、誰かがプログラムを実行したときに発生するエラーとイベントをログに記録します。
Python プログラミングでは、このようなエラーやイベントをログに記録できる logging
と呼ばれる組み込みモジュールがあります。 イベントはメッセージであり、イベントに固有のデータをオプションで保持できることに注意してください。
これらのイベントは、ソフトウェア開発者によって割り当てられたさまざまなレベル/重大度を持つことができます。 したがって、ロギングは、アプリケーションをデバッグし、必要な情報を追跡するための非常に強力なツールであると言えます。
logging
モジュールは、さまざまなログ ハンドラーを構成し、ログ メッセージをこれらのハンドラーにルーティングし、非常に柔軟な構成を有効にするためのさまざまな方法をアプリケーションに提供します。これは、さまざまなユース ケースの処理に役立ちます。
logging
モジュールにもさまざまなログ レベルがあり、さまざまな重大度レベルに対処するのに役立ちます。 次に、ログ レベルの簡単な説明を示します。
INFO
- いろいろと期待通りに動いていることが確認できました。DEBUG
- 誰かが問題を診断する際に、関心のある典型的な詳細情報を提供します。警告
- 予期せぬ事態が発生することを示しています。WARNING
は、ディスク容量不足など、間もなく発生する可能性がある問題を示しているとも言えます。CRITICAL
- アプリケーション自体が実行を継続できない重大なエラーを示します。エラー
- プログラムが操作または機能を実行できない、より深刻な問題を表しています。
logging
モジュールを Python でグローバルに使用する
logging
モジュールは、Python でローカルおよびグローバルに使用できます。 ここで、ローカルでは、特定のスコープで logging
モジュールを使用することを意味します。 たとえば、logging
モジュールを A.py
ファイルにインポートするため、B.py
ファイルではなく A.py
でのみ使用できます。
一方、グローバルとは、A.py
ファイルと B.py
ファイルのどこでも使用することを意味します。 Python グローバル ロガーを学習するには、ローカルでの logging
モジュールの使用を理解することが重要です。
logging
モジュールをローカルで使用したコード例 (test.py
ファイルに保存):
import logging
logger = logging.getLogger("test_logger")
logger.setLevel(logging.INFO)
def sum_numbers(number1, number2):
try:
output = number1 + number2
except TypeError:
logger.exception("Oh! TypeError Occurred")
else:
return output
result = sum_numbers(10, "Mehvish")
ここでは、インポートした test.py
ファイルでローカルに logging
モジュールを使用しています。
次に、getLogger()
を使用して、Python の logging
モジュールを使用してログを開始します。 そのために、ファクトリ関数 logging.getLogger(name)
が実行されます。
getLogger()
は、ロガーの名前である引数を 1つ取り、ロガー インスタンス (ロガーのオブジェクト) への参照を、指定されている場合はその名前で、そうでない場合は root
で返します。
getLogger()
を正確な名前で複数回呼び出すと、同じロガー インスタンスへの参照が返されることに注意してください。これは、グローバルに使用する場合に便利です (後で説明します)。
次に、setLevel()
メソッドを使用してロギングのレベルを設定し、sum_numbers()
関数を記述します。この関数は、2つの int
型の数値を取得してそれらを加算し、正しい値が与えられた場合に結果を返します。 そうでない場合は、TypeError
が生成されます。
最後に、sum_numbers()
を呼び出して、次の結果を生成することにより、logging
モジュールの動作を確認します。
出力:
Oh! TypeError Occurred
Traceback (most recent call last):
File "E:\Code\use_logging_locally\test.py", line 8, in sum
output = number1 + number2
TypeError: unsupported operand type(s) for +: 'int' and 'str'
logging
モジュールを使用するのは非常に簡単ですが、このモジュールをグローバルに活用するにはどうすればよいでしょうか? 以下でそれを学びましょう。
コード例 (log.py
ファイルに保存):
import logging
def set_custom_logger(name):
formatter = logging.Formatter(
fmt="%(asctime)s - %(levelname)s - %(module)s - %(message)s"
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
コード例 (submodule.py
ファイルに保存):
import logging
logger = logging.getLogger("root")
logger.debug("submodule message")
サンプルコード (main.py
ファイルに保存):
import submodule
import log
logger = log.setup_custom_logger("root")
logger.debug("main message")
出力:
2022-10-27 09:31:02,447 - DEBUG - main - main message
2022-10-27 09:31:02,450 - DEBUG - submodule - submodule message
このコード サンプルは、日付、時刻、ログ レベル、モジュール名、およびメッセージを出力します。 log.py
ファイルで使用した正確なロガー インスタンスを使用するために、submodule.py
で logging.getLogger()
を使用したことに注意してください。
どうやって? logging.getLogger(name)
は通常、Python の logging
モジュールを使用してロギングを開始するために実行されます。 getLogger()
は 1つの引数 (ロガーの名前) を受け入れます。
getLogger()
関数を使用することにより、提供されている場合は指定された名前のロガー インスタンスへの参照を取得し、指定されていない場合は root
を取得します。
正確な名前を持つ getLogger()
を複数回呼び出すと、正確なロガー オブジェクトへの参照が返されるため、グローバルに使用するのに役立ちます。