go-logging
Goでのロギング手法の選定、`slog`の設定、構造化ログの記述、ログレベルの決定が必要な場合に使用します。ユーザーが明示的に言及していなくても、本番環境向けロギングのセットアップ、リクエストスコープのコンテキストをログへ付加する処理、`log`から`slog`への移行時にも適用されます。エラーハンドリング戦略はカバーしません(`go-error-handling`を参照)。
description の原文を見る
Use when choosing a logging approach, configuring slog, writing structured log statements, or deciding log levels in Go. Also use when setting up production logging, adding request-scoped context to logs, or migrating from log to slog, even if the user doesn't explicitly mention logging. Does not cover error handling strategy (see go-error-handling).
SKILL.md 本文
Go ロギング
基本原則
ログはオペレーターのためのものであり、開発者のためではありません。すべてのログ行は、本番環境の問題を診断するのに役立つべきです。その目的を果たさないなら、それはノイズです。
ロガーの選択
規範的: 新しい Go コードには
log/slogを使用してください。
slog は構造化され、レベル付けされ、標準ライブラリに含まれています (Go 1.21+)。本番ロギングのニーズの大多数をカバーします。
どのロガーを使う?
├─ 新しい本番コード → log/slog
├─ 簡単な CLI / 一度限り → log (標準)
└─ 測定で確認されたパフォーマンスボトルネック → zerolog または zap (まずベンチマーク)
プロファイリングで slog がホットパスのボトルネックであることが示されない限り、サードパーティのロギングライブラリを導入しないでください。導入する場合は、同じ構造化キー値スタイルを維持してください。
slog ハンドラの設定、JSON/テキスト出力の構成、または log.Printf から slog への移行を行う場合は、
references/LOGGING-PATTERNS.mdを参照してください。
構造化ロギング
規範的: 常にキー値ペアを使用してください。メッセージ文字列に値を挿入しないでください。
メッセージは、何が起こったかの静的な説明です。動的データはキー値属性に入ります:
// 良い例: 静的なメッセージ、構造化フィールド
slog.Info("order placed", "order_id", orderID, "total", total)
// 悪い例: メッセージ文字列に焼き込まれた動的データ
slog.Info(fmt.Sprintf("order %d placed for $%.2f", orderID, total))
キー命名
助言的: ログ属性キーには
snake_caseを使用してください。
キーは小文字でアンダースコア区切りであり、コードベース全体で一貫していることが必要です: user_id, request_id, elapsed_ms。
型付き属性
パフォーマンスクリティカルなパスの場合は、型付きコンストラクタを使用してアロケーションを回避します:
slog.LogAttrs(ctx, slog.LevelInfo, "request handled",
slog.String("method", r.Method),
slog.Int("status", code),
slog.Duration("elapsed", elapsed),
)
ログパフォーマンスの最適化や Enabled() での事前チェック時は、
references/LEVELS-AND-CONTEXT.mdを参照してください。
ログレベル
助言的: これらのレベルセマンティクスに一貫して従ってください。
| レベル | 使用するとき | 本番環境デフォルト |
|---|---|---|
| Debug | 開発者のみの診断、内部状態のトレーシング | 無効 |
| Info | 注目すべきライフサイクルイベント: 起動、シャットダウン、設定読み込み | 有効 |
| Warn | 予期しないが復旧可能: 非推奨機能の使用、リトライ成功 | 有効 |
| Error | 操作失敗、オペレーター対応が必要 | 有効 |
経験則:
- 誰も対応する必要がなければ、Error ではなく Warn または Info を使用してください
- デバッガを接続した場合のみ有用な場合は、Debug を使用してください
slog.Errorには常に"err"属性が含まれるべきです
slog.Error("payment failed", "err", err, "order_id", id)
slog.Warn("retry succeeded", "attempt", n, "endpoint", url)
slog.Info("server started", "addr", addr)
slog.Debug("cache lookup", "key", key, "hit", hit)
Warn と Error の区別やカスタム詳細度レベルの定義については、
references/LEVELS-AND-CONTEXT.mdを参照してください。
リクエストスコープログ
助言的: コンテキストからロガーを派生させて、リクエストスコープフィールドを保持します。
ミドルウェアを使用してロガーをリクエスト ID、ユーザー ID、またはトレース ID で充実させ、充実されたロガーをコンテキストまたは明示的なパラメータを通じて下流に渡します:
func middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logger := slog.With("request_id", requestID(r))
ctx := context.WithValue(r.Context(), loggerKey, logger)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
そのリクエスト内の後続のすべてのログ呼び出しは request_id を自動的に保持します。
ロギングミドルウェアの実装またはコンテキストを通じたロガーの受け渡しについては、
references/LOGGING-PATTERNS.mdを参照してください。
ログまたは返却、両方ではなく
規範的: 各エラーを正確に 1 回処理します — ログするか返却するか、どちらかです。
エラーをログしてからそれを返却すると、呼び出し元がスタック上で同様に処理するため、重複ノイズが生じます。
// 悪い例: ここでログされ、スタック上のすべての呼び出し元でもログされる
if err != nil {
slog.Error("query failed", "err", err)
return fmt.Errorf("query: %w", err)
}
// 良い例: ラップして返却 — 呼び出し元が判断させる
if err != nil {
return fmt.Errorf("query: %w", err)
}
例外: HTTP ハンドラおよびその他のスタック上位の境界は、詳細なエラーをサーバー側でログしながら、サニタイズされたメッセージをクライアントに返却することができます:
if err != nil {
slog.Error("checkout failed", "err", err, "user_id", uid)
http.Error(w, "internal error", http.StatusInternalServerError)
return
}
ハンドル一度パターンとエラーラッピングガイダンスの完全については、go-error-handling を参照してください。
ログを取らないもの
規範的: シークレット、認証情報、PII、または高カーディナリティ無制限データを決してログに取らないでください。
- パスワード、API キー、トークン、セッション ID
- クレジットカード番号全体、SSN
- ユーザーデータを含むリクエスト/レスポンスボディ
- 無制限サイズのスライスまたはマップ全体
ログ属性に含めるのが安全なデータを決定する場合は、
references/LEVELS-AND-CONTEXT.mdを参照してください。
クイックリファレンス
| する | しない |
|---|---|
slog.Info("msg", "key", val) | log.Printf("msg %v", val) |
| 静的メッセージ + 構造化フィールド | メッセージ内の fmt.Sprintf |
snake_case キー | camelCase または一貫性のないキー |
| エラーをログするか返却する | 同じエラーをログしかつ返却する |
| コンテキストからロガーを派生させる | 呼び出しごとに新しいロガーを作成する |
"err" 属性を使用して slog.Error を使用する | エラーに対して slog.Info を使用する |
ホットパス上で Enabled() を事前チェックする | 常にログ引数を割り当てる |
関連スキル
- エラーハンドリング: エラーをログするか返却するかの判断、またはハンドル一度パターンについては、
go-error-handlingを参照してください - コンテキスト伝播: コンテキストを通じてリクエストスコープ値 (ロガーを含む) を渡すときは、
go-contextを参照してください - パフォーマンス: ホットパスロギングの最適化またはログ呼び出しのアロケーション削減については、
go-performanceを参照してください - コードレビュー: Go PR でのロギング慣行のレビュー時は、
go-code-reviewを参照してください
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。