MENU

【logging】Pythonの標準ログライブラリを紹介

この記事では、Pythonの標準ログライブラリloggingの概要と使い方について紹介します。

Pythonの環境構築がまだの方は、以下の記事をご覧ください。

目次

loggingライブラリとは

Pythonのloggingライブラリは、アプリケーションやライブラリでのログメッセージの生成、記録、および管理を行うための標準的なモジュールです。loggingライブラリでは、ログメッセージのレベル、フォーマット、出力先のカスタマイズが可能です。

サンプル

以下に主な使用方法のサンプルを紹介します。

基本的なログの設定と使用

import logging

# ログの設定
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# ログの出力
logging.debug('これはdebugメッセージです')
logging.info('これはinfoメッセージです')
logging.warning('これはwarningメッセージです')
logging.error('これはerrorメッセージです')
logging.critical('これはcriticalメッセージです')
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

この部分でログの設定を行っています。この例では、出力するログレベルをDEBUG以上に設定し、%(asctime)sでログメッセージが生成された時間、%(levelname)sでログレベル、%(message)sでログメッセージ内容を表示するようにフォーマットを設定しています。

実行結果

2024-06-20 23:34:04,115 - DEBUG - これはdebugメッセージです
2024-06-20 23:34:04,115 - INFO - これはinfoメッセージです
2024-06-20 23:34:04,115 - WARNING - これはwarningメッセージです
2024-06-20 23:34:04,115 - ERROR - これはerrorメッセージです
2024-06-20 23:34:04,115 - CRITICAL - これはcriticalメッセージです

ログファイルへの出力

import logging

# ログの設定
logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# ログの出力
logging.debug('これはdebugメッセージです')
logging.info('これはinfoメッセージです')
logging.warning('これはwarningメッセージです')
logging.error('これはerrorメッセージです')
logging.critical('これはcriticalメッセージです')
logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

この例では、ログの出力先をapp.logというファイルに指定しています。このコードを実行すると、プログラムの実行ディレクトリにapp.logが作成され、ファイル内にログが記録されます。

独自のロガーを作成

複数のモジュールでログを管理する場合、独自のロガーを使用すると便利です。

import logging

# ロガーの取得
logger = logging.getLogger(__name__)

# ハンドラーの作成
file_handler = logging.FileHandler('app.log')
console_handler = logging.StreamHandler()

# フォーマッターの作成
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# ハンドラーにログレベルを設定
file_handler.setLevel(logging.DEBUG)
console_handler.setLevel(logging.DEBUG)

# ロガーにハンドラーを追加
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# ロガーのログレベルを設定
logger.setLevel(logging.DEBUG)

# ログの出力
logger.debug('これはデバッグメッセージです')
logger.info('これは情報メッセージです')
logger.warning('これは警告メッセージです')
logger.error('これはエラーメッセージです')
logger.critical('これは重大なエラーメッセージです')
logger = logging.getLogger(__name__)

logger オブジェクトを作成します。__name__ は現在のモジュール名を指します。スクリプトが直接実行されている場合、__name__'__main__' となります。ロガーは、ログメッセージを生成し、ハンドラーに転送する役割を持ちます。

file_handler = logging.FileHandler('app.log')
console_handler = logging.StreamHandler()

この部分ではファイルハンドラーを作成しています。FileHandler は、ログメッセージをファイルに出力するハンドラーです。ここでは app.log というファイルにログを出力します。StreamHandler は、ログメッセージをコンソール(標準出力)に出力するハンドラーです。

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

ここでは、フォーマッターを作成しています。Formatter は、ログメッセージのフォーマットを指定します。ここでは、時刻、モジュール名、ログレベル、メッセージを含むフォーマットを設定しています。その後、フォーマッターをハンドラーに設定します。これにより、ハンドラーを通じて出力されるログメッセージが指定されたフォーマットに従って整形されます。

file_handler.setLevel(logging.DEBUG)
console_handler.setLevel(logging.DEBUG)

ハンドラーにログレベルを設定します。ここでは両方のハンドラーを DEBUG レベルに設定しているので、DEBUG レベル以上のすべてのログメッセージが処理されます。

logger.addHandler(file_handler)
logger.addHandler(console_handler)

ハンドラーをロガーに追加します。これにより、ロガーが生成するログメッセージは、ファイルおよびコンソールに出力されるようになります。

logger.setLevel(logging.DEBUG)

ハンドラーとは別にロガー自体にもログレベルを設定する必要があります。ハンドラーでDEBUGレベルのログを出力するので、ロガーでも DEBUG レベルに設定する必要があります。

実行結果

このプログラムを実行すると、コンソールとファイルそれぞれに以下のログが出力されます。

2024-06-20 23:56:47,431 - __main__ - DEBUG - これはデバッグメッセージです
2024-06-20 23:56:47,432 - __main__ - INFO - これは情報メッセージです
2024-06-20 23:56:47,432 - __main__ - WARNING - これは警告メッセージです
2024-06-20 23:56:47,432 - __main__ - ERROR - これはエラーメッセージです
2024-06-20 23:56:47,432 - __main__ - CRITICAL - これは重大なエラーメッセージです

ログのローテーション

長時間実行されるアプリケーションでは、ログファイルが大きくなりすぎるのを防ぐために、ログファイルのローテーションを行うことが一般的です。

import logging
from logging.handlers import RotatingFileHandler

# ロガーの取得
logger = logging.getLogger(__name__)

# ローテーションハンドラーの作成
handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# ロガーにハンドラーを追加
logger.addHandler(handler)

# ログレベルの設定
logger.setLevel(logging.DEBUG)

# ログの出力
for i in range(100):
    logger.debug(f'これはデバッグメッセージです: {i}')
# ローテーションハンドラーの作成
handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)

この部分でローテーションの設定を行っています。この例では、ログファイルの最大サイズを2,000 Byte、最大で5つのバックアップファイルを保持するように設定しています。また、古いファイルはローテーションで削除されます。

実行結果

このプログラムを実行すると、app.log、app.log.1、app.log.2、app.log.3、app.log.4の5つのファイルが生成されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

20代の組み込みソフトウェアエンジニア
主な使用言語はC++

---------------------資格---------------------
応用情報技術者
ネットワークスペシャリスト

目次