この記事では、Pythonの標準ログライブラリlogging
の概要と使い方について紹介します。
Pythonの環境構築がまだの方は、以下の記事をご覧ください。
![](https://beginner-engineer-study.com/wp-content/uploads/2024/07/52cdc0c04a0dc56f07074230b05fc7a4-1-300x169.png)
![](https://beginner-engineer-study.com/wp-content/uploads/2024/07/3e7b801e3a9f1a337c08823a1139ab45-1-300x169.png)
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つのファイルが生成されます。