いろいろ備忘録日記

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

Goメモ-477 (slogメモ-01)(基本的な使い方)

関連記事

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

参考情報

Goのおすすめ書籍


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

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