MENU
やすひら
やすひらと申します。
長靴を履いたタヌキ(ITエンジニア)です。
モノ作りの楽しさを発信中。
X(旧Twitter)のフォローもお願いします。

[Python]ログ出力

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("重大なエラーメッセージを出力")

logger.hasHandlersを判定して、ロガーが重複実行されているかを判定します。
logger.propageteをFalseに設定して、ロガーの伝播を無効化します。

まとめ

Pythonのログの出力方法を紹介しました。

Pythonのログ出力は
  • ログ設定を行うことができる
  • ログレベルを指定できる
  • ログフォーマットを指定できる
  • ロガー関数で設定できる

ログはデバッグやトレースに必要な情報です。
Pythonで効果的なログ出力ができれば、デバッグやトレースがしやすくなるので、覚えて実践していきたい事項の1つです。

  • URLをコピーしました!
目次