structlog-python
Pythonで構造化ロギングを実装したい場合に、ログにコンテキスト情報を追加したり、ログ処理パイプラインを構成したり、標準ロギングを型付き出力に置き換えたりするのを支援するSkill。
📜 元の英語説明(参考)
Add structured logging to Python with structlog. Use when a user asks to implement structured logging, add context to Python logs, configure log processing pipelines, or replace standard logging with typed output.
🇯🇵 日本人クリエイター向け解説
Pythonで構造化ロギングを実装したい場合に、ログにコンテキスト情報を追加したり、ログ処理パイプラインを構成したり、標準ロギングを型付き出力に置き換えたりするのを支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o structlog-python.zip https://jpskill.com/download/15428.zip && unzip -o structlog-python.zip && rm structlog-python.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15428.zip -OutFile "$d\structlog-python.zip"; Expand-Archive "$d\structlog-python.zip" -DestinationPath $d -Force; ri "$d\structlog-python.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
structlog-python.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
structlog-pythonフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
structlog
概要
structlog は、構造化された、コンテキストが豊富なロギングを Python に追加します。フォーマット文字列の代わりに、キーと値のペアを渡します。これは、JSON (本番環境) または色分けされた人間が読める出力 (開発環境) としてレンダリングされます。バインドされたロガーは、関数呼び出し間でコンテキストを引き継ぎます。
手順
ステップ 1: 設定
# logging_config.py — structlog の設定
import structlog
import logging
import sys
def setup_logging(environment: str = "development"):
"""アプリケーション用に structlog を設定します。
Args:
environment: 'development' は見やすい出力、'production' は JSON
"""
shared_processors = [
structlog.contextvars.merge_contextvars,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.StackInfoRenderer(),
structlog.processors.UnicodeDecoder(),
]
if environment == "production":
renderer = structlog.processors.JSONRenderer()
else:
renderer = structlog.dev.ConsoleRenderer(colors=True)
structlog.configure(
processors=[
*shared_processors,
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(structlog.stdlib.ProcessorFormatter(
processors=[*shared_processors, renderer],
))
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
ステップ 2: 使い方
# services/orders.py — ビジネスロジックにおける構造化ロギング
import structlog
log = structlog.get_logger()
async def process_order(order_id: str, user_id: str):
# 関数全体で引き継がれるコンテキストをバインドします
log_ctx = log.bind(order_id=order_id, user_id=user_id)
log_ctx.info("Processing order")
items = await fetch_order_items(order_id)
log_ctx.info("Items fetched", item_count=len(items), total=sum(i.price for i in items))
try:
payment = await charge_payment(order_id)
log_ctx.info("Payment charged", payment_id=payment.id, amount=payment.amount)
except PaymentError as e:
log_ctx.error("Payment failed", error=str(e), error_code=e.code)
raise
log_ctx.info("Order completed", status="success")
ステップ 3: リクエストコンテキスト
# middleware.py — すべてのログにリクエストコンテキストを追加します
import structlog
from uuid import uuid4
async def logging_middleware(request, call_next):
request_id = request.headers.get("x-request-id", str(uuid4()))
structlog.contextvars.clear_contextvars()
structlog.contextvars.bind_contextvars(
request_id=request_id,
method=request.method,
path=request.url.path,
user_id=getattr(request.state, "user_id", None),
)
log = structlog.get_logger()
log.info("Request started")
response = await call_next(request)
log.info("Request completed", status_code=response.status_code)
response.headers["x-request-id"] = request_id
return response
ガイドライン
- リクエストスコープのコンテキストには
contextvarsを使用します — リクエスト内のすべてのログに requestId、userId が含まれます。 - 本番環境では JSON 出力、開発環境では見やすいコンソール — 同じコードで、異なるレンダラーを使用します。
- 早めにコンテキストをバインド (
log.bind(...)) すると、後続のすべてのログ呼び出しに引き継がれます。 - structlog は stdlib logging をラップします —
loggingを使用する既存のライブラリで動作します。 - 文字列ではなく、イベントをログに記録します:
log.info("order_processed", order_id=id)、log.info(f"Processed order {id}")ではありません。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
structlog
Overview
structlog adds structured, context-rich logging to Python. Instead of format strings, you pass key-value pairs that render as JSON (production) or colorized human-readable output (development). Bound loggers carry context across function calls.
Instructions
Step 1: Configuration
# logging_config.py — structlog setup
import structlog
import logging
import sys
def setup_logging(environment: str = "development"):
"""Configure structlog for the application.
Args:
environment: 'development' for pretty output, 'production' for JSON
"""
shared_processors = [
structlog.contextvars.merge_contextvars,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.StackInfoRenderer(),
structlog.processors.UnicodeDecoder(),
]
if environment == "production":
renderer = structlog.processors.JSONRenderer()
else:
renderer = structlog.dev.ConsoleRenderer(colors=True)
structlog.configure(
processors=[
*shared_processors,
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(structlog.stdlib.ProcessorFormatter(
processors=[*shared_processors, renderer],
))
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
Step 2: Usage
# services/orders.py — Structured logging in business logic
import structlog
log = structlog.get_logger()
async def process_order(order_id: str, user_id: str):
# Bind context that carries through the entire function
log_ctx = log.bind(order_id=order_id, user_id=user_id)
log_ctx.info("Processing order")
items = await fetch_order_items(order_id)
log_ctx.info("Items fetched", item_count=len(items), total=sum(i.price for i in items))
try:
payment = await charge_payment(order_id)
log_ctx.info("Payment charged", payment_id=payment.id, amount=payment.amount)
except PaymentError as e:
log_ctx.error("Payment failed", error=str(e), error_code=e.code)
raise
log_ctx.info("Order completed", status="success")
Step 3: Request Context
# middleware.py — Add request context to all logs
import structlog
from uuid import uuid4
async def logging_middleware(request, call_next):
request_id = request.headers.get("x-request-id", str(uuid4()))
structlog.contextvars.clear_contextvars()
structlog.contextvars.bind_contextvars(
request_id=request_id,
method=request.method,
path=request.url.path,
user_id=getattr(request.state, "user_id", None),
)
log = structlog.get_logger()
log.info("Request started")
response = await call_next(request)
log.info("Request completed", status_code=response.status_code)
response.headers["x-request-id"] = request_id
return response
Guidelines
- Use
contextvarsfor request-scoped context — all logs in the request include requestId, userId. - JSON output in production, pretty console in development — same code, different renderer.
- Bind context early (
log.bind(...)) and it carries through all subsequent log calls. - structlog wraps stdlib logging — it works with existing libraries that use
logging. - Log events, not strings:
log.info("order_processed", order_id=id)notlog.info(f"Processed order {id}").