いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-478 (slogメモ-02)(構造化ログの出力)

関連記事

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

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。