From ff55cf3b8af3526da0b30d052fec3322a6b7f6f2 Mon Sep 17 00:00:00 2001 From: devlights Date: Sun, 29 Sep 2024 16:14:59 +0000 Subject: [PATCH] Add slog examples --- examples/slog/05.text-handler/Taskfile.yml | 8 +++ examples/slog/05.text-handler/main.go | 67 ++++++++++++++++++++++ examples/slog/06.json-handler/Taskfile.yml | 8 +++ examples/slog/06.json-handler/main.go | 54 +++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 examples/slog/05.text-handler/Taskfile.yml create mode 100644 examples/slog/05.text-handler/main.go create mode 100644 examples/slog/06.json-handler/Taskfile.yml create mode 100644 examples/slog/06.json-handler/main.go diff --git a/examples/slog/05.text-handler/Taskfile.yml b/examples/slog/05.text-handler/Taskfile.yml new file mode 100644 index 00000000..6210a5f1 --- /dev/null +++ b/examples/slog/05.text-handler/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/slog/05.text-handler/main.go b/examples/slog/05.text-handler/main.go new file mode 100644 index 00000000..5b03df27 --- /dev/null +++ b/examples/slog/05.text-handler/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "context" + "log/slog" + "os" + "time" +) + +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パッケージは、テキスト形式でのログ出力を簡単に実現できる。 + // ハンドラに slog.TextHandler を指定すれば良い。 + // + // 注意点として、TextHandlerとJSONHandlerでは timeキー の出力値が少し異なる。 + // + // - TextHandler: ベースは time.RFC3339Nano だが、ミリ秒までの精度で出力される + // - JSONHandler: time.RFC3339Nano + // + // Goのソースコード go/src/log/slog/handler.go の appendRFC3339Millis() に + // 説明が以下のように記載されている。以下、 go1.23.1 時点でのコメント。 + // + // Format according to time.RFC3339Nano since it is highly optimized, + // but truncate it to use millisecond resolution. + // Unfortunately, that format trims trailing 0s, so add 1/10 millisecond + // to guarantee that there are exactly 4 digits after the period. + // (time.RFC3339Nanoは高度に最適化されているので、それにしたがってフォーマットするが、 + // ミリ秒の分解能を使うために切り捨てる。残念なことに、このフォーマットでは末尾の0が切り捨てられるので、 + // ピリオドの後に正確に4桁の数字があることを保証するために1/10ミリ秒を追加する。) + // + + var ( + opt = &slog.HandlerOptions{ + Level: slog.LevelDebug, + } + handler = slog.NewTextHandler(os.Stdout, opt) + logger = slog.New(handler) + ch = make(chan int) + ) + + go func() { + defer close(ch) + for i := range 3 { + ch <- i + <-time.After(10 * time.Millisecond) + } + }() + + for i := range ch { + logger.Debug("LOOP", "i", i) + } + + return nil +} diff --git a/examples/slog/06.json-handler/Taskfile.yml b/examples/slog/06.json-handler/Taskfile.yml new file mode 100644 index 00000000..6210a5f1 --- /dev/null +++ b/examples/slog/06.json-handler/Taskfile.yml @@ -0,0 +1,8 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + cmds: + - go run . diff --git a/examples/slog/06.json-handler/main.go b/examples/slog/06.json-handler/main.go new file mode 100644 index 00000000..e9c8e022 --- /dev/null +++ b/examples/slog/06.json-handler/main.go @@ -0,0 +1,54 @@ +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 +}