Pythonでは、ログを出力することができます。
ログの出力条件をロガーとして設定することもでき、柔軟なログ出力が可能です。
Pythonのログの出力方法を紹介します。
やすひら
Pythonのログの出力方法を紹介します
この記事でわかること
- ログ出力の方法
- ログ出力の内容
- ロガーの定義
目次
ログ出力
Pythonのログの出力方法を紹介します。
Pythonではログの出力方法とログの出力内容を設定して、ログを出力させることができます。
ソースコード
import logging
# ファイルにログを保存
logging.basicConfig(
filename='debug.log',
level=logging.DEBUG,
format="%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(funcName)s %(message)s",
datefmt="[%Y-%m-%d %H:%M%S]"
)
logging.info('ロガーの設定')
def debug_log():
logging.debug('デバッグメッセージを出力')
def debug_info():
logging.info('情報メッセージを出力')
def debug_warning():
logging.warning('警告メッセージを出力')
def debug_error():
logging.error('エラーメッセージを出力')
def debug_critical():
logging.critical('重大なエラーメッセージを出力')
def debug_try():
try:
# 処理の中で例外が発生する可能性がある
result = 10 / 0
except Exception as e:
logging.error("例外エラーが発生しました:%s", e)
if __name__ == '__main__':
logging.info('メイン処理の実行')
debug_log()
debug_info()
debug_warning()
debug_error()
debug_critical()
debug_try()
ログ
[2024-10-21 14:3630] INFO python-log.py:11 <module> ロガーの設定
[2024-10-21 14:3630] INFO python-log.py:36 <module> メイン処理の実行
[2024-10-21 14:3630] DEBUG python-log.py:14 debug_log デバッグメッセージを出力
[2024-10-21 14:3630] INFO python-log.py:17 debug_info 情報メッセージを出力
[2024-10-21 14:3630] WARNING python-log.py:20 debug_warning 警告メッセージを出力
[2024-10-21 14:3630] ERROR python-log.py:23 debug_error エラーメッセージを出力
[2024-10-21 14:3630] CRITICAL python-log.py:26 debug_critical 重大なエラーメッセージを出力
[2024-10-21 14:3630] ERROR python-log.py:33 debug_try 例外エラーが発生しました:division by zero
ロガーの設定
Pythonでは、ログ設定をロガー関数として設定することができます。
ソースコード
import logging
from logging import handlers
def setup_logger(log_file='app.log', log_level=logging.INFO):
# ロガーオブジェクトの作成
logger = logging.getLogger('app_logger')
logger.setLevel(log_level)
# ログフォーマットの定義
formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(filename)s:%(lineno)d %(funcName)s %(message)s")
datefmt="%Y-%m-%d %H:%M%S"
# コンソール(標準出力)へのハンドラ
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# ファイルへのハンドラ
file_handler = logging.handlers.RotatingFileHandler(log_file, maxBytes=1024 * 1024, backupCount=3)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
if __name__ == '__main__':
logger = setup_logger('debug.log', logging.DEBUG)
logger.debug("デバッグメッセージを出力")
logger.info("情報メッセージを出力")
logger.warning("警告メッセージを出力")
logger.error("エラーメッセージを出力")
logger.critical("重大なエラーメッセージを出力")
ログ
[2024-10-21 15:52:06,759] DEBUG python-logger.py:27 <module> デバッグメッセージを出力
[2024-10-21 15:52:06,760] INFO python-logger.py:28 <module> 情報メッセージを出力
[2024-10-21 15:52:06,760] WARNING python-logger.py:29 <module> 警告メッセージを出力
[2024-10-21 15:52:06,760] ERROR python-logger.py:30 <module> エラーメッセージを出力
[2024-10-21 15:52:06,760] CRITICAL python-logger.py:31 <module> 重大なエラーメッセージを出力
ログの出力内容
効果的なログの出力内容を紹介します。
情報 | 出力内容 |
---|---|
日時情報 | 処理を実行した日時 |
ログレベル | メッセージの重要レベル |
モジュール名/関数名 | 処理を実行したモジュールや関数の名称 |
メッセージ | 発生事象を説明するメッセージ |
スタックトレース | 例外処理のスタックトレース |
日時情報
ログに日時を含めることで、いつ処理を実行したかを確認することができます。
複数の処理が並行処理されている状況では、発生日時とログの日時情報を比較してトレースすることができます。
ログレベル
ログレベルでメッセージの重要レベルを出力します。
主なログレベルを紹介します。
ログレベル | 出力内容 |
---|---|
DEBUG | デバッグに必要なログ |
INFO | 出力したいメッセージのログ |
WARNING | 警告のログ |
ERROR | エラーのログ |
CRITICAL | クリティカル(重要度が高い)のログ |
モジュール名/関数名
処理を実行したモジュールや関数の名称を、ログに出力することで、エラーが発生舌箇所を特定しやすくなります。
メッセージ
発生事象を説明するメッセージを簡潔で具体的に記述することで、トレースしやすくします。
スタックトレース
例外処理のスタックトレースを出力することで、例外処理が発生した要因を特定しやすくします。
トラブルシューティング
筆者が陥ったトラブルの対処について紹介します。
ログが複数回出力される
ログが複数回出力される場合、以下の原因が考えられます。
- ロガーを重複して実行している
- ロガーが伝播している
ログ重複しないロガーの例を紹介します。
ソースコード
import logging
from logging import handlers
def setup_logger(log_file='app.log', log_level=logging.INFO):
# ロガーオブジェクトの作成
logger = logging.getLogger('app_logger')
# ロガーが存在しない場合にハンドラを生成
if not logger.hasHandlers():
logger.propagete = False
logger.setLevel(log_level)
# ログフォーマットの定義
formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(filename)s:%(lineno)d %(funcName)s %(message)s")
datefmt="%Y-%m-%d %H:%M%S"
# コンソール(標準出力)へのハンドラ
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# ファイルへのハンドラ
file_handler = logging.handlers.RotatingFileHandler(log_file, maxBytes=1024 * 1024, backupCount=3)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
if __name__ == '__main__':
logger = setup_logger('debug.log', logging.DEBUG)
logger.debug("デバッグメッセージを出力")
logger.info("情報メッセージを出力")
logger.warning("警告メッセージを出力")
logger.error("エラーメッセージを出力")
logger.critical("重大なエラーメッセージを出力")
まとめ
Pythonのログの出力方法を紹介しました。
Pythonのログ出力は
- ログ設定を行うことができる
- ログレベルを指定できる
- ログフォーマットを指定できる
- ロガー関数で設定できる
ログはデバッグやトレースに必要な情報です。
Pythonで効果的なログ出力ができれば、デバッグやトレースがしやすくなるので、覚えて実践していきたい事項の1つです。