関連記事
Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
少しづつメモしていきます。今回は構造化ログの出力について。
サンプル
package main import ( "context" "flag" "log/slog" "os" ) type ( ctxKey int Args struct { json bool } ) var ( key1 = ctxKey(1) args Args ) func init() { flag.BoolVar(&args.json, "json", false, "output with json-layout") } func main() { flag.Parse() slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil))) if args.json { slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil))) } var ( rootCtx = context.Background() ctx = context.WithValue(rootCtx, key1, "ctx-value-1") ) if err := run(ctx); err != nil { panic(err) } } func run(ctx context.Context) error { // // slog は、「構造化ログ」に対応している。 // // 構造化ログとは、主にJSONなどの機械的に読み取り可能な形でパラメータを付加した形式のログのこと。 // このようなログは、付加したパラメータなどを動的にパースしてフィルタ・加工することで、 // 容易にログを絞り込んだり可視化に利用しやすいというメリットがある。 // // REF: https://blog.cybozu.io/entry/2024/08/07/080000 // // // slogでは、メッセージの後に キーと値 のペアを使用して追加情報を付与出来る // 最初に指定するメッセージは msg というキーが付与される // slog.Info("メッセージ", "ctx-key", ctx.Value(key1), "key", "value", "user", os.Getenv("USER"), "pwd", os.Getenv("PWD")) return nil }
実行すると以下のように出力されます。
$ task task: [default] go run . time=2024-09-26T07:55:00.505Z level=INFO msg=メッセージ ctx-key=ctx-value-1 key=value user=gitpod pwd=/workspace/try-golang/examples/slog/02.structured-log task: [default] go run . -json {"time":"2024-09-26T07:55:00.682389087Z","level":"INFO","msg":"メッセージ","ctx-key":"ctx-value-1","key":"value","user":"gitpod","pwd":"/workspace/try-golang/examples/slog/02.structured-log"}
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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。