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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化ログを使う理由
- slogハンドラ
- ログレベルと属性
- カスタムハンドラ