Pythonのロギング: loggingモジュールを利用したロギングの解説と実例

Pythonには、アプリケーションのログ出力に役立つ標準ライブラリであるloggingがあります。ロギングを使用すると、アプリケーションの動作やエラーなどの情報を記録し、必要に応じてデバッグトラブルシューティングに役立てることができます。本記事では、Pythonでのロギングの基本的な使い方と、コードの実例を交えて説明します。

Pythonのロギングモジュールとは

Pythonのloggingモジュールは、アプリケーションの実行中にメッセージを生成し、それらのメッセージを適切な場所に送信することを可能にする強力な機能を提供します。

ログレベル(DEBUG、INFO、WARNING、ERROR、CRITICAL)を指定し、それぞれのレベルに対応するメッセージを生成できます。また、ログファイルやコンソールに出力するなど、ログメッセージの出力先も自由に設定できます。

loggingモジュールを使用することで、アプリケーションの実行中に発生した問題を追跡し、デバッグやエラー処理に役立てることができます。また、複数のモジュールでログを共有することもでき、アプリケーション全体の状態をより詳細に理解することができます。

簡単に言うと、loggingモジュールはアプリケーションの実行中に出力されるメッセージを管理するためのツールであり、デバッグやエラー処理に役立ちます。

ロギングの基本的な使い方

Pythonのloggingモジュールを使用すると、ログレベルに応じて、コンソールやファイルにログを出力することができます。loggingモジュールを使用するには、まず以下のようにimportします。

import logging

loggingモジュールを使用する際には、以下の4つの主要な要素を使用します。

  1. Logger:ログ出力を管理するオブジェクト
  2. Handler:ログ出力先を管理するオブジェクト
  3. Formatter:ログの出力形式を管理するオブジェクト
  4. LogRecord:ログレコードを表すオブジェクト

Loggerオブジェクトの作成

まずは、Loggerオブジェクトを作成します。Loggerオブジェクトは、ログレベルを指定して作成することができます。以下のように作成します。

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

ここでは、nameを指定してLoggerオブジェクトを作成し、ログレベルをINFOに設定しています。nameは、現在のモジュール名を表す特殊な変数です。これにより、モジュールごとに独立したLoggerオブジェクトを作成することができます。

Handlerオブジェクトの作成

次に、Handlerオブジェクトを作成します。Handlerオブジェクトは、ログの出力先を指定して作成することができます。以下のように作成します。

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

ここでは、StreamHandlerを使用して、ログをコンソールに出力するHandlerオブジェクトを作成しています。また、ログレベルをINFOに設定しています。この他にログレベルには、DEBUG、INFO、WARNING、ERROR、CRITICALの5つがあります。

Formatterオブジェクトの作成

次に、Formatterオブジェクトを作成します。Formatterオブジェクトは、ログの出力形式を指定して作成することができます。以下のように作成します。

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

ここでは、ログの出力形式を指定してFormatterオブジェクトを作成しています。%()sの部分は、ログに出力する情報を表しています。具体的には、以下のようなものがあります。

  • %(asctime)s:ログ出力時刻
  • %(name)s:Loggerオブジェクトの名前
  • %(levelname)s:ログレベル
  • %(message)s:ログメッセージ

HandlerオブジェクトにFormatterオブジェクトを設定する

次に、作成したFormatterオブジェクトを、先程作成したHandlerオブジェクトに設定します。

console_handler.setFormatter(formatter)

ここでは、先程作成したFormatterオブジェクトを、console_handlerに設定しています。

LoggerオブジェクトにHandlerオブジェクトを設定する

最後に、作成したHandlerオブジェクトを、Loggerオブジェクトに設定します。

logger.addHandler(console_handler)

ここでは、先程作成したconsole_handlerを、loggerに設定しています。これにより、Loggerオブジェクトから出力されるログが、console_handlerによってコンソールに出力されるようになります。

ロギングの実例

上記の手順に従って、ロギングを実際に行う例を示します。

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# ログをファイルに出力するハンドラーを設定
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.WARNING)

# ログのフォーマットを設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# ハンドラーをLoggerオブジェクトに追加
logger.addHandler(file_handler)

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        logger.error("division by zero")
    else:
        logger.info(f"{a} / {b} = {result}")
        return result

divide(4, 2)
divide(1, 0)

この例では、ログをファイルに出力するハンドラーを設定し、ログレベルをWARNINGに設定しています。また、divide関数の実行結果をログに出力するようにしています。この例では、4 / 2 の結果がINFOレベルで、1 / 0 の結果がERRORレベルで出力されます。

実行結果として、example.logファイルに以下のような内容が出力されます。

2023-04-01 00:00:00,000 - __main__ - INFO - 4 / 2 = 2.0
2023-04-01 00:00:00,000 - __main__ - ERROR - division by zero

まとめ

このように、ロギングを使用すると、アプリケーションの動作やエラーなどの情報を記録し、必要に応じてデバッグトラブルシューティングに役立てることができます。ロギングは、開発者がアプリケーションをより効率的かつ安全に開発するための重要なツールの1つです。これらのプログラムはPythonの基本的な文法とライブラリで実装することができます。Pythonの基礎学習には下記のようなサイトの利用が有効です。

click.linksynergy.com

click.linksynergy.com