PYTHON MEBY

Pythonでロギングを使う(logging)

この記事ではPythonのloggingモジュールについて解説します。ログレベル、ハンドラ、フォーマッタの設定方法、そして様々なユースケースでの実践的な使用方法を説明します。

目次

基本的なロギング

Pythonのloggingモジュールを使うと、アプリケーションの実行状況を記録できます。最も基本的な使い方は以下の通りです。

import logging
logging.basicConfig(level=logging.INFO)
logging.info('これはインフォメーションレベルのログメッセージです')
logging.warning('これはワーニングレベルのログメッセージです')
logging.error('これはエラーレベルのログメッセージです')

basicConfig()関数でログレベルを設定します。ログレベルは、INFO, WARNING, ERROR, CRITICALなどがあります。デフォルトではWARNINGレベル以上がコンソールに出力されます。

ログレベル

ログレベルは、ログメッセージの重要度を表します。ログレベルは以下の通りです。 DEBUG: 詳細なデバッグ情報 INFO: プログラムの実行状況 WARNING: 問題が発生する可能性がある状況 ERROR: エラーが発生した状況 CRITICAL: システムに深刻なエラーが発生した状況

ログレベルを設定することで、出力するログメッセージを制御できます。

ハンドラ

ハンドラは、ログメッセージを出力する先を指定します。コンソール出力、ファイル出力など様々なハンドラがあります。

import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug('これはデバッグレベルのログメッセージです')

上記の例では、StreamHandlerを使ってコンソールに出力しています。Formatterを使ってログメッセージのフォーマットも設定できます。

フォーマッタ

フォーマッタは、ログメッセージのフォーマットを指定します。%(asctime)s、%(name)s、%(levelname)s、%(message)sなどのフォーマット指定子が使えます。

import logging
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
# ... (ハンドラの設定など)

ファイルへのログ出力

FileHandlerを使うと、ログメッセージをファイルに出力できます。

import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('mylog.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('これはファイルに出力されるログメッセージです')

mylog.logというファイルにログが出力されます。

複数のハンドラ

複数のハンドラを追加することで、ログメッセージを複数の出力先に送信できます。

import logging
logger = logging.getLogger(__name__)
# ... (ハンドラの設定)
logger.addHandler(handler1)
logger.addHandler(handler2)
# ...

ロガーの階層構造

loggingモジュールはロガーの階層構造を持っています。親ロガーと子ロガーの関係で、ログ出力の制御ができます。

import logging
logger1 = logging.getLogger('parent')
logger2 = logging.getLogger('parent.child')
logger1.warning('親ロガーのメッセージ')
logger2.warning('子ロガーのメッセージ')

子ロガーは親ロガーの設定を継承します。

実践的な例

より複雑なロギングの設定例です。

import logging
import os

log_file = os.path.join(os.getcwd(), 'my_app.log')

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

# create console handler and set level to debug
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

# create error file handler and set level to error
file_handler_error = logging.FileHandler(log_file, 'w')
file_handler_error.setLevel(logging.ERROR)
formatter_error = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler_error.setFormatter(formatter_error)
logger.addHandler(file_handler_error)

logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

この例では、コンソールとファイルの両方にログを出力し、エラーレベル以上のログは別ファイルに出力します。

関連記事