Pythonにはログを出力する『logging』モジュールがあります。
この記事では『logging』モジュールを使用してコンソールおよびファイルの両方に
ログを出力する方法について紹介します。
ログ出力方法
コンソールとファイルにログを出力するにはLoggerオブジェクトに
「コンソール出力用のハンドラー」と「ファイル出力用のハンドラー」を設定します。
サンプルコード
import logging
# ロガーオブジェクトを生成
logger = logging.getLogger(__name__)
# ログレベル(logger)
logger.setLevel(logging.DEBUG)
# ハンドラーを生成する(コンソール)
stream_handler = logging.StreamHandler()
# ログレベル(handler)
stream_handler.setLevel(logging.DEBUG)
# ログフォーマット
stream_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(filename)s %(message)s'))
# ハンドラーを設定
logger.addHandler(stream_handler)
# ハンドラーを生成する(ファイル)
file_handler = logging.FileHandler('C:\\Python\\logging\\logging_test.log')
# ログレベル(handler)
file_handler.setLevel(logging.DEBUG)
# ログフォーマット
file_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(filename)s %(message)s'))
# ハンドラーを設定
logger.addHandler(file_handler)
# ログ出力
logger.debug('debuglevelmessage')
logger.info('infolevelmessage')
logger.warning('warninglevelmessage')
logger.error('errorlevelmessage')
logger.critical('criticallevelmessage')
コードの解説
1行目~6行目:Loggerオブジェクトを生成
Loggerオブジェクトを生成して、ログレベルを設定します。
import logging
# ロガーオブジェクトを生成
logger = logging.getLogger(__name__)
# ログレベル(logger)
logger.setLevel(logging.DEBUG)
8行目 ~15行目:ハンドラーを生成(コンソール出力用)
コンソール出力用のハンドラーを生成します。
コンソールへの出力は『StreamHandler()』を使用します。
# ハンドラーを生成する(コンソール)
stream_handler = logging.StreamHandler()
# ログレベル(handler)
stream_handler.setLevel(logging.DEBUG)
# ログフォーマット
stream_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(filename)s %(message)s'))
# ハンドラーを設定
logger.addHandler(stream_handler)
17行目 ~24行目:ハンドラー生成(ファイル出力用)
ファイル出力用のハンドラーを生成します。
ファイルへの出力は『FileHandler(出力ファイル名)』を使用します。
# ハンドラーを生成する(ファイル)
file_handler = logging.FileHandler('C:\\Python\\logging\\logging_test.log')
# ログレベル(handler)
file_handler.setLevel(logging.DEBUG)
# ログフォーマット
file_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(filename)s %(message)s'))
# ハンドラーを設定
logger.addHandler(file_handler)
26行目 ~ 31行目:ログへの出力
『Loggerオブジェクト.ログレベル(出力メッセージ)』でコンソールとファイルの
両方へ出力されます。
# ログ出力
logger.debug('debuglevelmessage')
# 出力結果:2022-04-12 12:36:14,124 [DEBUG] test_logging.py debuglevelmessage
logger.info('infolevelmessage')
# 出力結果:2022-04-12 12:36:14,128 [INFO] test_logging.py infolevelmessage
logger.warning('warninglevelmessage')
# 出力結果:2022-04-12 12:36:14,130 [WARNING] test_logging.py warninglevelmessage
logger.error('errorlevelmessage')
# 出力結果:2022-04-12 12:36:14,132 [ERROR] test_logging.py errorlevelmessage
logger.critical('criticallevelmessage')
# 出力結果:2022-04-12 12:36:14,134 [CRITICAL] test_logging.py criticallevelmessage
ログレベルについて
ログレベルは5段階となっています。
次の表で下に向かうほど深刻なメッセージとなります。
DEBUG | 開発中などに動作を検証する時に出力するレベル |
---|---|
INFO | 正常な動作をしている時に出力するレベル |
WARNING | 問題が発生する可能性を警告する時に出力するレベル |
ERROR | 問題が発生した時の出力するレベル |
CRITICAL | 致命的なエラーが発生した際に出力するレベル |
ログフォーマット
今回、使用したログフォーマットの内容は次の通りです。
%(asctime)s
|
ログを出力した時刻 出力例:2022-04-12 12:36:14,124 |
---|---|
%(levelname)s
|
ログレベル 出力例:DEBUG、INFOなど |
%(filename)s
|
ファイル名 |
%(message)s
|
ログ出力メッセージ |