0Pricing
Go Academy · レッスン

slogハンドラ

テキストとJSONのハンドラを使用します

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

ハンドラーが形式を決める

slog では、Logger が Handler を呼び出して各レコードを整形し、書き込みます。ハンドラーを差し替えるだけで、ログ呼び出しを変更せずに出力形式を変更できます。

TextHandler

slog.NewTextHandler は、人間が読みやすい key=value 形式の行を書き出します。ローカル開発やターミナルでの利用に適しています。

package main

import (
    "log/slog"
    "os"
)

func main() {
    h := slog.NewTextHandler(os.Stdout, nil)
    logger := slog.New(h)
    logger.Info("hello", "env", "dev")
}

JSONHandler

slog.NewJSONHandler は、1行につき1つの JSON オブジェクトを出力します。本番環境のログパイプラインに適しています。

package main

import (
    "log/slog"
    "os"
)

func main() {
    h := slog.NewJSONHandler(os.Stdout, nil)
    logger := slog.New(h)
    logger.Info("hello", "env", "prod")
}

Loggerの作成

slog.New(handler) はハンドラーを Logger でラップします。そのインスタンスに対して logger.Info、logger.Error などを呼び出します。

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

HandlerOptions

ハンドラーコンストラクターの2番目の引数は *slog.HandlerOptions です。デフォルト設定を使用する場合は nil を渡し、ログレベルやソース位置を設定することもできます。

opts := &slog.HandlerOptions{
    Level:     slog.LevelDebug,
    AddSource: true,
}
h := slog.NewJSONHandler(os.Stdout, opts)

ファイルやバッファへの書き込み

ハンドラーは任意の io.Writer を受け取ります。ファイル、テスト用のバッファ、標準出力のいずれにもログを書き込めます。この分離は slog の重要な設計上のポイントです。

f, _ := os.Create("app.log")
logger := slog.New(slog.NewJSONHandler(f, nil))

デフォルトLoggerの設定

slog.SetDefault(logger) を設定すると、パッケージレベルの関数(slog.Info など)が指定したハンドラーを使用するようになります。起動時に一度設定してください。

slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
slog.Info("now JSON by default")

テキスト出力とJSON出力

同じ呼び出しでも、形式は2種類あります。

  • テキスト:time=... level=INFO msg=hello env=dev
  • JSON:{"time":"...","level":"INFO","msg":"hello","env":"dev"}

ハンドラーの選択

一般的な目安は次のとおりです。

  • ローカル開発:TextHandler(読みやすい)
  • 本番環境・集約環境:JSONHandler(解析しやすい)

環境変数で選択すれば、同じバイナリを環境に応じて動作させられます。

再利用可能なセットアップの作成

Logger の構築を一元化し、アプリケーション全体で1つの設定を共有します。

func newLogger(prod bool) *slog.Logger {
    if prod {
        return slog.New(slog.NewJSONHandler(os.Stdout, nil))
    }
    return slog.New(slog.NewTextHandler(os.Stdout, nil))
}

実行例:ハンドラーの切り替え

このプログラムは、同じイベントを両方のハンドラーで記録するため、形式を比較できます。

package main

import (
    "log/slog"
    "os"
)

func main() {
    text := slog.New(slog.NewTextHandler(os.Stdout, nil))
    js := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    text.Info("login", "user", "ada")
    js.Info("login", "user", "ada")
}

理解度チェック

slog のハンドラーについて、理解度を確認しましょう。

まとめ

slog のハンドラーについて学びました。

  • ハンドラーがレコードを整形して書き込み、Logger がハンドラーを呼び出す
  • 人間向けには NewTextHandler、機械向けには NewJSONHandler を使用する
  • ハンドラーは任意の io.Writer と *HandlerOptions を受け取る
  • slog.SetDefault でパッケージレベルの関数を接続する

よくある質問

「slogハンドラ」レッスンは無料ですか?

はい。「slogハンドラ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「slogハンドラ」で何を学びますか?

テキストとJSONのハンドラを使用します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「slogハンドラ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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