カスタムハンドラ
独自のログ出力を構築します
「カスタムハンドラ」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
組み込みハンドラーでは不十分な場合
TextHandler と JSONHandler でほとんどの用途に対応できますが、色付きのターミナル表示、メトリクスシステムへの送信、シークレットの秘匿化など、独自の出力が必要になる場合もあります。その場合はカスタム Handlerを作成します。
Handlerインターフェース
Handler は次の4つのメソッドを実装します。
Enabled(ctx, level) boolHandle(ctx, record) errorWithAttrs(attrs) HandlerWithGroup(name) Handler
type Handler interface {
Enabled(context.Context, slog.Level) bool
Handle(context.Context, slog.Record) error
WithAttrs(attrs []slog.Attr) slog.Handler
WithGroup(name string) slog.Handler
}Enabledがフィルタリングを制御する
Enabled はレコードを構築する前に呼び出されます。false を返すと slog は処理全体を省略できるため、レベルの確認に使用してください。
func (h *MyHandler) Enabled(_ context.Context, l slog.Level) bool {
return l >= slog.LevelInfo
}Handleが処理を実行する
Handle は、時刻、レベル、メッセージ、属性を含む slog.Record を受け取ります。どのように整形して書き込むかは自由に決められます。
func (h *MyHandler) Handle(_ context.Context, r slog.Record) error {
fmt.Printf("[%s] %s\n", r.Level, r.Message)
return nil
}属性の反復処理
Record は r.Attrs を通じて属性を公開します。r.Attrs は各属性に対して指定した関数を呼び出します。
r.Attrs(func(a slog.Attr) bool {
fmt.Printf(" %s=%v\n", a.Key, a.Value)
return true // keep going
})WithAttrsとWithGroup
これらは、あらかじめ設定した属性やグループのプレフィックスを保持する Handler のコピーを返します。logger.With と slog.Group をサポートするためのものです。最小限の Handler では、これらを保存して後から再生することも、学習目的で自分自身を返すこともできます。
作成する代わりにラップする
完全な Handler が必要ない場合も多くあります。既存の Handler をラップし、固定属性の追加やキーの秘匿化など、必要な動作だけを上書きできます。
type RedactHandler struct{ slog.Handler }
func (h RedactHandler) Handle(ctx context.Context, r slog.Record) error {
// mutate r here, then delegate
return h.Handler.Handle(ctx, r)
}ユースケース:マスキング
マスキング用の Handler は、password や token のような機密性の高いキーを属性から探し、JSON ハンドラーに委譲する前に値を置き換えられます。
ユースケース:ルーティング
カスタム Handler では、レベルに応じてログを振り分けられます。Error ログを stderr とアラート用 Webhook に送信し、Info を stdout に送信するといった処理が可能です。これにより、各呼び出し箇所にルーティングロジックを記述せずに済みます。
パフォーマンスに関する注意点
Handle は頻繁に実行される処理で呼び出されることがあります。メモリ確保を避け、Enabled でレベルを確認し、バッファを再利用してください。標準ハンドラーが内部でプールしたバッファを使用するのも、このためです。
実行例:最小限のカスタムHandler
この自己完結型のプログラムは、レベル、メッセージ、属性を出力する小さな Handler を定義し、それを通じてログを記録します。
package main
import (
"context"
"fmt"
"log/slog"
)
type Mini struct{}
func (Mini) Enabled(context.Context, slog.Level) bool { return true }
func (Mini) WithAttrs(a []slog.Attr) slog.Handler { return Mini{} }
func (Mini) WithGroup(string) slog.Handler { return Mini{} }
func (Mini) Handle(_ context.Context, r slog.Record) error {
fmt.Printf("%s: %s", r.Level, r.Message)
r.Attrs(func(a slog.Attr) bool {
fmt.Printf(" %s=%v", a.Key, a.Value)
return true
})
fmt.Println()
return nil
}
func main() {
l := slog.New(Mini{})
l.Info("hello", "user", "ada", "id", 7)
}理解度チェック
カスタム Handler について、理解度を確認しましょう。
まとめ
カスタム Handler の作成方法を学びました。
Enabled、Handle、WithAttrs、WithGroupを実装する- パフォーマンスのため、
Enabledでレベルを確認する r.Attrsで属性を反復処理する- 多くの場合、ゼロから作成するより既存の Handler をラップするほうが簡単
よくある質問
「カスタムハンドラ」レッスンは無料ですか?
はい。「カスタムハンドラ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「カスタムハンドラ」で何を学びますか?
独自のログ出力を構築します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「カスタムハンドラ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化ログを使う理由
- slogハンドラ
- ログレベルと属性
- カスタムハンドラ