Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

golang-samber-slog

`samber/slog-****` パッケージ群を活用したGolangの構造化ログ拡張スキルです。マルチハンドラーパイプライン(slog-multi)、ログサンプリング(slog-sampling)、属性フォーマット(slog-formatter)、HTTPミドルウェア(slog-fiber / slog-gin / slog-chi / slog-echo)、およびDatadog・Sentry・Loki・Syslog・Logstash・Graylogなどへのバックエンドルーティングに対応します。`slog` を使用・導入する場面や、コードベースに `github.com/samber/slog-*` パッケージが既にインポートされている場合に適用してください。

description の原文を見る

Structured logging extensions for Golang using samber/slog-**** packages — multi-handler pipelines (slog-multi), log sampling (slog-sampling), attribute formatting (slog-formatter), HTTP middleware (slog-fiber, slog-gin, slog-chi, slog-echo), and backend routing (slog-datadog, slog-sentry, slog-loki, slog-syslog, slog-logstash, slog-graylog...). Apply when using or adopting slog, or when the codebase already imports any github.com/samber/slog-* package.

SKILL.md 本文

ペルソナ: あなたはGoログアーキテクトです。すべてのレコードが正しいハンドラーを通過するログパイプラインを設計します — サンプリングが早期にノイズをドロップし、フォーマッターがプロセスを離れる前にPIIを削除し、ルーターがエラーをSentryに、情報をLokiに送信します。

samber/slog-**** — Go用構造化ログパイプライン

Go 1.21以上向けの20以上の組み合わせ可能なslog.Handlerパッケージ。3つのコアパイプラインライブラリに加えて、HTTPミドルウェアとバックエンドシンク(すべて標準slog.Handlerインターフェースを実装)があります。

公式リソース:

このスキルは完全ではありません。詳細についてはライブラリドキュメントとコード例を参照してください。Context7は発見可能性プラットフォームとしてサポートできます。

パイプラインモデル

すべてのsamber/slogパイプラインは標準的な順序に従います。レコードは左から右へフローします — サンプリングを最初に配置して早期にドロップし、到達しないレコードのためにCPUを無駄にしないようにします。

record → [Sampling] → [Pipe: trace/PII] → [Router] → [Sinks]

順序が重要です:サンプリングをフォーマッティング前に行うとCPUを節約します。フォーマッティングをルーティング前に行うと、すべてのシンクがクリーンな属性を受け取ります。この順序を逆にするとドロップされるレコードに対して無駄な作業が生じます。

コアライブラリ

ライブラリ用途主なコンストラクタ
slog-multiハンドラー合成Fanout, Router, FirstMatch, Failover, Pool, Pipe
slog-samplingスループット制御UniformSamplingOption, ThresholdSamplingOption, AbsoluteSamplingOption, CustomSamplingOption
slog-formatter属性変換PIIFormatter, ErrorFormatter, FormatByType[T], FormatByKey, FlattenFormatterMiddleware

slog-multi — ハンドラー合成

異なるルーティングニーズ向けの6つの合成パターン:

パターン動作レイテンシ影響
Fanout(handlers...)すべてのハンドラーに順序立てて放送すべてのハンドラーレイテンシの合計
Router().Add(h, predicate).Handler()マッチするすべてのハンドラーへルーティングマッチするハンドラーの合計
Router().Add(...).FirstMatch().Handler()最初にマッチしたハンドラーのみにルーティング単一ハンドラーレイテンシ
Failover()(handlers...)成功するまで順序立てて試行プライマリハンドラーレイテンシ(成功時)
Pool()(handlers...)すべてのハンドラーに並行放送すべてのハンドラーレイテンシの最大値
Pipe(middlewares...).Handler(sink)シンク前のミドルウェアチェーンミドルウェアオーバーヘッド+シンク
// エラーをSentryにルーティング、すべてのログを標準出力に
logger := slog.New(
    slogmulti.Router().
        Add(sentryHandler, slogmulti.LevelIs(slog.LevelError)).
        Add(slog.NewJSONHandler(os.Stdout, nil)).
        Handler(),
)

組み込みプレディケート:LevelIs, LevelIsNot, MessageIs, MessageIsNot, MessageContains, MessageNotContains, AttrValueIs, AttrKindIs

すべてのパターンの完全なコード例については、Pipeline Patternsを参照してください。

slog-sampling — スループット制御

戦略動作最適用途
Uniformすべてのレコードの固定%をドロップ開発/ステージングノイズ削減
Threshold間隔あたり最初のN件をログ、その後レートRでサンプリング本番環境 — 初期可視性を保持
Absolute間隔あたり全体でNレコードにキャップハードコスト管理
Customユーザー関数がレコードごとのサンプリングレートを返すレベル対応またはタイム対応ルール

サンプリングはパイプラインの最も外側のハンドラーである必要があります — フォーマッティング後に配置するとドロップされるレコードのためにCPUを無駄にします。

// Threshold: 5秒あたり最初の10件、その後10% — エラーはルーターを介して常に通過
logger := slog.New(
    slogmulti.
        Pipe(slogsampling.ThresholdSamplingOption{
            Tick: 5 * time.Second, Threshold: 10, Rate: 0.1,
        }.NewMiddleware()).
        Handler(innerHandler),
)

マッチャーは重複排除のための類似レコードをグループ化します:MatchByLevel(), MatchByMessage(), MatchByLevelAndMessage()(デフォルト), MatchBySource(), MatchByAttribute(groups, key)

戦略比較と設定詳細については、Sampling Strategiesを参照してください。

slog-formatter — 属性変換

Pipeミドルウェアとして適用して、すべての下流ハンドラーがクリーンな属性を受け取るようにします。

logger := slog.New(
    slogmulti.Pipe(slogformatter.NewFormatterMiddleware(
        slogformatter.PIIFormatter("user"),          // PIIフィールドをマスク
        slogformatter.ErrorFormatter("error"),       // 構造化エラー情報
        slogformatter.IPAddressFormatter("client"),  // IPアドレスをマスク
    )).Handler(slog.NewJSONHandler(os.Stdout, nil)),
)

主なフォーマッター:PIIFormatter, ErrorFormatter, TimeFormatter, UnixTimestampFormatter, IPAddressFormatter, HTTPRequestFormatter, HTTPResponseFormatter。汎用フォーマッター:FormatByType[T], FormatByKey, FormatByKind, FormatByGroup, FormatByGroupKey。ネストされた属性をフラット化するにはFlattenFormatterMiddlewareを使用します。

HTTPミドルウェア

フレームワーク全体での一貫したパターン:router.Use(slogXXX.New(logger))

利用可能:slog-gin, slog-echo, slog-fiber, slog-chi, slog-http(net/http)。

すべてConfig構造体を共有:DefaultLevel, ClientErrorLevel, ServerErrorLevel, WithRequestBody, WithResponseBody, WithUserAgent, WithRequestID, WithTraceID, WithSpanID, Filters

// フィルター付きGin — ヘルスチェックをスキップ
router.Use(sloggin.NewWithConfig(logger, sloggin.Config{
    DefaultLevel:     slog.LevelInfo,
    ClientErrorLevel: slog.LevelWarn,
    ServerErrorLevel: slog.LevelError,
    WithRequestBody:  true,
    Filters: []sloggin.Filter{
        sloggin.IgnorePath("/health", "/metrics"),
    },
}))

フレームワーク固有のセットアップについては、HTTP Middlewaresを参照してください。

バックエンドシンク

すべてがOption{}.NewXxxHandler()コンストラクタパターンに従います。

カテゴリパッケージ
Cloudslog-datadog, slog-sentry, slog-loki, slog-graylog
Messagingslog-kafka, slog-fluentd, slog-logstash, slog-nats
Notificationslog-slack, slog-telegram, slog-webhook
Storageslog-parquet
Bridgesslog-zap, slog-zerolog, slog-logrus

バッチハンドラーは適切なシャットダウンが必要ですslog-datadog, slog-loki, slog-kafka, slog-parquetは内部でレコードをバッファリングします。シャットダウン時にフラッシュしてください(例:Datadogのhandler.Stop(ctx)、LokiのlokiClient.Stop()、Kafkaのwriter.Close())またはバッファリングされたログが失われます。

設定例とシャットダウンパターンについては、Backend Handlersを参照してください。

よくある間違い

間違い失敗理由修正
フォーマッティング後のサンプリングドロップされるレコードをフォーマッティングするCPUを無駄にするサンプリングを最も外側のハンドラーとして配置
多くの同期ハンドラーへのFanout呼び出し元をブロック — レイテンシはすべてのハンドラーの合計並行ディスパッチにPool()を使用
バッチハンドラーでのシャットダウンフラッシュの欠落バッファリングされたログはシャットダウンで失われるdefer handler.Stop(ctx)(Datadog)、defer lokiClient.Stop()(Loki)、defer writer.Close()(Kafka)
デフォルト/キャッチオールハンドラーなしのRouterマッチしないレコードは暗黙的にドロッププレディケートなしのハンドラーをキャッチオールとして追加
HTTPミドルウェアなしのAttrFromContextコンテキストに抽出するリクエスト属性がないまずslog-gin/echo/fiber/chiミドルウェアをインストール
ミドルウェアなしのPipeの使用ノーオップラッパーがレコードごとのオーバーヘッドを追加ミドルウェアが不要な場合はPipe()を削除

パフォーマンス警告

  • Fanoutレイテンシ = すべてのハンドラーレイテンシの合計(順序立て)。それぞれ10msの5つのハンドラーでは、すべてのログ呼び出しに50msかかります。レイテンシを最大値に削減するにはPool()を使用してください
  • Pipeミドルウェアはレコードごとの関数呼び出しオーバーヘッドを追加します — チェーンは短く保ってください(2-4ミドルウェア)
  • slog-formatterは属性を順序立てて処理します — 多くのフォーマッターが複合します。ホットパス属性フォーマッティングの場合、代わりにあなたのタイプにslog.LogValuerを実装することを好みます
  • ベンチマーク本番展開前にgo test -benchでパイプラインを測定してください

診断: パイプラインのレコードごとの割り当てとレイテンシを測定し、チェーン内のどのハンドラーが最も割り当てるかを特定してください。

ベストプラクティス

  1. 最初にサンプリング、次にフォーマッティング、最後にルーティング — この標準的な順序は無駄な作業を最小化し、すべてのシンクがクリーンなデータを見ることを保証します
  2. 横断的な関心事にはPipeを使用 — トレースID挿入とPIIスクラビングはハンドラーごとのロジックではなくミドルウェアに属します
  3. slogmulti.NewHandleInlineHandlerでパイプラインをテスト — 実際のシンクなしで各段階に到達するレコードをアサート
  4. AttrFromContextを使用してリクエストスコープの属性をHTTPミドルウェアからすべてのハンドラーに伝播
  5. FanoutよりもRouterを優先ハンドラーが異なるレコードサブセットを必要とする場合 — ルーターはプレディケートを評価し、マッチしないハンドラーをスキップします

クロスリファレンス

  • → slog基礎(レベル、コンテキスト、ハンドラーセットアップ、マイグレーション)についてsamber/cc-skills-golang@golang-observabilityスキルを参照
  • → ログリターンルールについてsamber/cc-skills-golang@golang-error-handlingスキルを参照
  • → ログのPIIハンドリングについてsamber/cc-skills-golang@golang-securityスキルを参照
  • samber/oopsを使用した構造化エラーコンテキストについてsamber/cc-skills-golang@golang-samber-oopsスキルを参照

samber/slog-* パッケージのバグまたは予期しない動作に遭遇した場合、関連するリポジトリでissueを作成してください(例:slog-multi/issues, slog-sampling/issues)。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
samber
リポジトリ
samber/cc-skills-golang
ライセンス
MIT
最終更新
不明

Source: https://github.com/samber/cc-skills-golang / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: samber · samber/cc-skills-golang · ライセンス: MIT