Python グローバル ロガー

Mehvish Ashiq 2023年6月21日
  1. ロギングの概要と Python におけるその重要性
  2. logging モジュールを Python でグローバルに使用する
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.pylogging.getLogger() を使用したことに注意してください。

どうやって? logging.getLogger(name) は通常、Python の logging モジュールを使用してロギングを開始するために実行されます。 getLogger() は 1つの引数 (ロガーの名前) を受け入れます。

getLogger() 関数を使用することにより、提供されている場合は指定された名前のロガー インスタンスへの参照を取得し、指定されていない場合は root を取得します。

正確な名前を持つ getLogger() を複数回呼び出すと、正確なロガー オブジェクトへの参照が返されるため、グローバルに使用するのに役立ちます。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Python Logging