構造化ロギング
機械で読み取れる 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 responseECSログ形式
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フィードバックを取得できます。ローカル設定は不要です。