関連記事
Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記
Goメモ-478 (slogメモ-02)(構造化ログの出力) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
今更ながら、Go 1.21で導入された log/slog
を使ってみたりしています。
少しづつメモしていきます。今回はデフォルトロガーについて。
サンプル
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 { panic(err) } } func run(_ context.Context) error { // // slog.Info()のように明示的にロガーを生成せずに // 利用すると、内部でデフォルトのロガーが呼び出される。 // // デフォルトロガーは以下の特徴を持つ。 // - 標準エラー出力に出力する // - テキスト形式 // - ログレベルはInfo // // デフォルトロガーは、グローバル変数として実装されているため // 並行処理時の競合を避けるために内部で同期化されている。 // そのため、高負荷な環境では若干のパフォーマンスオーバーヘッドが発生する可能性がある。 // // デフォルトロガーは、アプリケーション全体で一貫したログ出力を簡単に実現できる反面、柔軟性に欠ける面がある。 // 特定のモジュールや機能で異なるログ設定が必要な場合は、個別のロガーインスタンスを作成する方が良い。 // (これは他の言語の場合でも同様) // slog.Debug("これは出力されない", "key", "value") slog.Info("これは出力される", "key", "value") // // デフォルトロガーの設定を変更するには // slog.SetDefault() // を利用する // var ( opt = &slog.HandlerOptions{Level: slog.LevelDebug} handler = slog.NewJSONHandler(os.Stderr, opt) logger = slog.New(handler) ) slog.SetDefault(logger) slog.Debug("今度は出力される", "key", "value") slog.Info("これは出力される", "key", "value") return nil }
実行すると以下のように出力されます。
$ task task: [default] go run . 2024/09/26 07:58:40 INFO これは出力される key=value {"time":"2024-09-26T07:58:40.188093168Z","level":"DEBUG","msg":"今度は出力される","key":"value"} {"time":"2024-09-26T07:58:40.188103028Z","level":"INFO","msg":"これは出力される","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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。