関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
基本的にちょっとしたツールを作成するだけだったら従来の log
パッケージで事足りていたので困ってなかったのですよね。
今度は log/slog
が主流になっていくでしょうし、この機会に少し試して使い方くらいは覚えておこうかなと。
少しづつメモしていきます。今回は基本的な使い方。
サンプル
package main import ( "context" "log/slog" "os" ) func main() { // // slogのデフォルト設定 // // - JSON形式 // - DEBUGレベルから出力 // - ソースの情報は出力しない // - time属性は表示しない // var ( opt = &slog.HandlerOptions{ Level: slog.LevelDebug, AddSource: false, ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.TimeKey { return slog.Attr{} } return a }, } handler = slog.NewJSONHandler(os.Stdout, opt) logger = slog.New(handler) ) slog.SetDefault(logger) type ( ctxKey string ) var ( rootCtx = context.Background() ctx = context.WithValue(rootCtx, ctxKey("ctx-key"), "ctx-value") ) if err := run(ctx); err != nil { panic(err) } } func run(ctx context.Context) error { // // 従来のlogパッケージと異なり、log/slogパッケージには // ログレベルが存在する. 存在するレベルは // // - Debug // - Info // - Warn // - Error // // また、各ログレベル毎のメソッドは // XXXContextというメソッドも持っている。 // // これにより、コンテキストに含まれる情報をログに出力することが可能となっている。 // しかし、コンテキストからの情報を扱うにはカスタムハンドラが必要となる。 // // メッセージの後のキー/値は、いくつでも設定出来る (...any となっている) // const ( msg = "hello world" k = "key" v = "value" ) slog.Debug(msg, k, v) slog.DebugContext(ctx, msg, k, v) slog.Info(msg, k, v) slog.Warn(msg, k, v) slog.Error(msg, k, v) // // ログレベルを外から指定することができる汎用メソッドもある // slog.Log(ctx, slog.LevelInfo, msg, k, v) return nil }
実行すると以下のように出力されます。
$ task task: [default] go run . {"level":"DEBUG","msg":"hello world","key":"value"} {"level":"DEBUG","msg":"hello world","key":"value"} {"level":"INFO","msg":"hello world","key":"value"} {"level":"WARN","msg":"hello world","key":"value"} {"level":"ERROR","msg":"hello world","key":"value"} {"level":"INFO","msg":"hello world","key":"value"} task: [default] go run . | jq . { "level": "DEBUG", "msg": "hello world", "key": "value" } { "level": "DEBUG", "msg": "hello world", "key": "value" } { "level": "INFO", "msg": "hello world", "key": "value" } { "level": "WARN", "msg": "hello world", "key": "value" } { "level": "ERROR", "msg": "hello world", "key": "value" } { "level": "INFO", "msg": "hello world", "key": "value" }
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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。