0Pricing
Python Academy · レッスン

構造化ロギング

機械で読み取れる JSON 形式のログを出力します。

「構造化ロギング」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

構造化ロギングとは

構造化ロギングは、自由形式のテキストではなく、機械可読データ(JSON)としてログレコードを出力します。これにより、インデックス化、検索、アラート設定が容易になります。

import logging, json

def log_json(level, msg, **kw):
    record = {"level": level, "msg": msg, **kw}
    print(json.dumps(record))

log_json("INFO", "Request received", path="/api/users", method="GET")

カスタムJSONフォーマッター

logging.Formatterをサブクラス化すると、プレーンテキストの代わりにJSONを出力できます。

import logging, json

class JSONFormatter(logging.Formatter):
    def format(self, record):
        return json.dumps({
            "time": self.formatTime(record),
            "level": record.levelname,
            "name": record.name,
            "msg": record.getMessage(),
        })

handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)

python-json-logger

python-json-loggerパッケージは、標準フィールドと追加フィールドに対応した既製のJSONフォーマッターを提供します。

# pip install python-json-logger
import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(jsonlogger.JsonFormatter())
logger.addHandler(handler)
logger.info("User created", extra={"user_id": 42})

structlog

structlogは、コンテキストの蓄積とフォーマットを分離し、プロセッサーパイプラインをサポートする人気のサードパーティーライブラリです。

# pip install structlog
import structlog

log = structlog.get_logger()
log = log.bind(request_id="abc123")
log.info("payment_processed", amount=49.99, currency="USD")

structlogによるコンテキストのバインド

structlogでは、後続のすべての呼び出しに引き継がれるロガーに、キーと値のペアをバインドできます。

import structlog

log = structlog.get_logger().bind(
    service="auth",
    env="prod"
)
log.warning("login_failed", user="alice", reason="bad_password")
# {service:auth, env:prod, user:alice, reason:bad_password}

タイムスタンプと呼び出し元情報の追加

プロセッサーはレコードを自動的に拡張できます。TimeStamperとCallsiteParameterAdderをすべてのログレコードに追加します。

import structlog

structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.CallsiteParameterAdder([structlog.processors.CallsiteParameter.FILENAME]),
        structlog.processors.JSONRenderer(),
    ]
)

WebアプリでのリクエストIDのロギング

Webフレームワークでは、各リクエストの開始時にリクエストIDをバインドすると、そのリクエスト中のすべてのログ行にIDが含まれます。

import structlog

def middleware(request, call_next):
    req_id = request.headers.get("X-Request-Id", generate_id())
    log = structlog.get_logger().bind(request_id=req_id)
    log.info("request_started", path=request.url.path)
    response = call_next(request)
    log.info("request_finished", status=response.status_code)
    return response

ECSログ形式

Elastic Common Schema(ECS)は、Elastic Stackで使用される標準のJSONログ形式です。Pythonではecs-loggingを使います。

# pip install ecs-logging
import logging
import ecs_logging

logger = logging.getLogger("app")
handler = logging.StreamHandler()
handler.setFormatter(ecs_logging.StdlibFormatter())
logger.addHandler(handler)
logger.info("Event logged in ECS format")

ログ集約システム

構造化されたJSONログは、Elasticsearch/Kibana(ELK)、Grafana Loki、Datadog、AWS CloudWatch Logs Insightsなどの集約ツールに自然に取り込めます。

# Loki query example:
# {app="myservice"} | json | level="ERROR"

# CloudWatch Insights:
# fields @timestamp, level, msg
# | filter level = "ERROR"
# | sort @timestamp desc

ログ内でのPIIの回避

ロギングの前に個人を特定できる情報を除去してください。カスタムプロセッサーまたはフィルターを使って、メールアドレス、トークン、パスワードをマスクします。

import re

def mask_pii(_, __, event_dict):
    msg = event_dict.get("event", "")
    event_dict["event"] = re.sub(
        r"[\w.+-]+@[\w-]+\.[\w.]+", "***@***.***", msg
    )
    return event_dict

構造化ログと非構造化ログのトレードオフ

構造化ログは検索やアラート設定が容易ですが、冗長になります。環境に基づく設定を使い、本番環境では構造化ロギングを、開発環境では人間が読みやすい形式を組み合わせてください。

import structlog, os

if os.getenv("ENV") == "production":
    renderer = structlog.processors.JSONRenderer()
else:
    renderer = structlog.dev.ConsoleRenderer()

structlog.configure(processors=[renderer])

クイックチェック

JSON形式の構造化ログがプレーンテキストのログより優れている主な点は何ですか。

まとめ

構造化ロギングは、キーと値を持つJSONレコードを出力します。JSONFormatter、python-json-logger、またはstructlogを使います。操作の開始時にコンテキスト(リクエストIDやユーザーなど)をバインドすると、その操作中のすべてのログ行にコンテキストが引き継がれます。

よくある質問

「構造化ロギング」レッスンは無料ですか?

はい。「構造化ロギング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「構造化ロギング」で何を学びますか?

機械で読み取れる JSON 形式のログを出力します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「構造化ロギング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. logging モジュールの基礎
  2. ハンドラー、フォーマッター、フィルター
  3. 構造化ロギング
  4. pdb によるデバッグ
← Python Academyに戻る