SIMPLE

structlogを用いてJSON形式でログ出力を行うための設定

構造化ロギングを行うために広く利用されているstructlogを利用したログ出力設定についての、個人的なベストプラクティス。

項目を自由に追加して、ログ出力時に引数として渡すことも可能。

import json
import logging
from typing import Any

import structlog


def setup_logging():
    """structlogによるログ出力設定を行う."""

    # Python標準のロギング設定
    logging.basicConfig(level=logging.INFO)

    # structlogの設定
    structlog.configure(
        processors=[
            structlog.processors.TimeStamper(fmt="iso", utc=False),
            structlog.stdlib.add_logger_name,  # ロガー名を追加
            structlog.stdlib.add_log_level,  # ログレベルを追加
            structlog.processors.format_exc_info,  # 例外情報を追加
            custom_json_renderer,  # JSON形式のログを出力
        ],
        logger_factory=structlog.stdlib.LoggerFactory(),  # Python標準のロガーを使用
    )


def custom_json_renderer(_, __, event_dict: dict[str, Any]) -> str:
    """JSON形式のログのKey名と順序を指定する.
    Args:
        event_dict (dict): ログの辞書.

    Returns:
        str: JSON形式のログ.
    """

    ordered_event_dict = {
        "timestamp": event_dict.get("timestamp", ""),
        "level": event_dict.get("level", ""),
        "logger": event_dict.get("logger", ""),
        "message": event_dict.get("event", ""),
        "exception": event_dict.get("exception", ""),
    }

    return json.dumps(ordered_event_dict, ensure_ascii=False)
import structlog

from logs import setup_logging


setup_logging()
logger: structlog.stdlib.BoundLogger = structlog.get_logger(__name__)


logger.info()
logger.warning()
logger.exception()
import structlog


logger: structlog.stdlib.BoundLogger = structlog.get_logger(__name__)


logger.info()
logger.warning()
logger.exception()

oddy

"チーバくんの目"のあたりで暮らす、フリーランスエンジニアのoddyです。 サイト名の"OJTHON"(オジソン)の由来は、わが家での私のあだ名とプログラミング言語Python(パイソン)のもじりです。 僕たち家族の思い出と記録、そして今の僕が考えることについて、何かしらの形にして残していきたいと思い、このOJTHON.dev HOME / BLOGを作りました。