0Pricing
Go Academy · レッスン

カスタムハンドラ

独自のログ出力を構築します

「カスタムハンドラ」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

組み込みハンドラーでは不十分な場合

TextHandler と JSONHandler でほとんどの用途に対応できますが、色付きのターミナル表示、メトリクスシステムへの送信、シークレットの秘匿化など、独自の出力が必要になる場合もあります。その場合はカスタム Handlerを作成します。

Handlerインターフェース

Handler は次の4つのメソッドを実装します。

  • Enabled(ctx, level) bool
  • Handle(ctx, record) error
  • WithAttrs(attrs) Handler
  • WithGroup(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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化ログを使う理由
  2. slogハンドラ
  3. ログレベルと属性
  4. カスタムハンドラ
← Go Academyに戻る