関連記事
Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記
Goメモ-478 (slogメモ-02)(構造化ログの出力) - いろいろ備忘録日記
Goメモ-479 (slogメモ-03)(デフォルトロガー) - いろいろ備忘録日記
Goメモ-480 (slogメモ-04)(従来のlogパッケージとの連携) - いろいろ備忘録日記
Goメモ-482 (slogメモ-05)(テキスト形式のログ) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
少しづつメモしていきます。今回はJSON形式のログ(JSONHandler) について。
サンプル
main.go
package main import ( "context" "log/slog" "os" ) func main() { var ( rootCtx = context.Background() ctx, cxl = context.WithCancel(rootCtx) ) defer cxl() if err := run(ctx); err != nil { slog.Error("A fatal error occurred", "error", err) os.Exit(1) } } func run(_ context.Context) error { // // slogパッケージは、JSON形式でのログ出力を簡単に実現できる。 // ハンドラに slog.JSONHandler を指定すれば良い。 // // 注意点として、TextHandlerとJSONHandlerでは timeキー の出力値が少し異なる。 // // - TextHandler: ベースは time.RFC3339Nano だが、ミリ秒までの精度で出力される // - JSONHandler: time.RFC3339Nano // var ( opt = &slog.HandlerOptions{ Level: slog.LevelDebug, } handler = slog.NewJSONHandler(os.Stdout, opt) logger = slog.New(handler) ch = make(chan int) ) go func() { defer close(ch) for i := range 3 { ch <- i } }() for i := range ch { logger.Debug("LOOP", "i", i) } return nil }
実行すると以下のように出力されます。
Taskfile.yml
# https://taskfile.dev version: '3' tasks: default: cmds: - go run .
shell
$ task task: [default] go run . {"time":"2024-09-30T05:04:12.035867022Z","level":"DEBUG","msg":"LOOP","i":0} {"time":"2024-09-30T05:04:12.036058462Z","level":"DEBUG","msg":"LOOP","i":1} {"time":"2024-09-30T05:04:12.036067162Z","level":"DEBUG","msg":"LOOP","i":2}
try-golang/examples/slog at main · devlights/try-golang · GitHub
参考情報
- Structured Logging with slog
- log/slog
- Goのslog使い方まとめ
- Go1.21 log/slogパッケージ超入門
- Go公式の構造化ロガー(として提案されている)slogを触ってみたメモ
- slog を触る(Group, Context)
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。