関連記事
Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記
Goメモ-478 (slogメモ-02)(構造化ログの出力) - いろいろ備忘録日記
Goメモ-479 (slogメモ-03)(デフォルトロガー) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
少しづつメモしていきます。今回は従来のlogパッケージとの連携について。
サンプル
package main import ( "context" "log" "log/slog" "os" ) type ( SlogWriter struct { logger *slog.Logger level slog.Level } ) func (me *SlogWriter) Write(p []byte) (int, error) { me.logger.Log(context.Background(), me.level, string(p)) return len(p), nil } func main() { var ( rootCtx = context.Background() ctx, cxl = context.WithCancel(rootCtx) ) defer cxl() if err := run(ctx); err != nil { panic(err) } } func run(_ context.Context) error { // // slogパッケージは、従来のlogパッケージと共存できるように設計されている。 // これにより、既存のコードベースを段階的に移行したり、サードパーティライブラリとの互換性を維持したりすることが可能。 // // リンクロガーを利用する場合は、slog.NewLogLogger() を用いる。 // この *log.Logger 経由でログ出力すると、内部でslogを通じて出力されることになる。 // var ( opt = &slog.HandlerOptions{Level: slog.LevelDebug} handler = slog.NewTextHandler(os.Stdout, opt) logger = slog.New(handler) linkLogger = slog.NewLogLogger(handler, slog.LevelInfo) ) logger.Debug("[SLOG] HELLO WORLD") linkLogger.Println("[LOG ] HELLO WORLD") // // 上とは別のやり方として、io.Writerを実装した状態にして // log.New() で渡して利用するというやり方も出来る。 // // ただし、この場合、出力先として指定しているので // 通常の log.Print() の処理を通り、メッセージの末尾に 改行(\n) が追加される。 // var ( writer = &SlogWriter{logger, slog.LevelDebug} linkLogger2 = log.New(writer, "", 0) ) linkLogger2.Print("[LOG2] HELLO WORLD") return nil }
実行すると以下のように出力されます。
$ task task: [default] go run . time=2024-09-26T08:00:17.412Z level=DEBUG msg="[SLOG] HELLO WORLD" time=2024-09-26T08:00:17.412Z level=INFO msg="[LOG ] HELLO WORLD" time=2024-09-26T08:00:17.412Z level=DEBUG msg="[LOG2] HELLO WORLD\n"
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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。