いろいろ備忘録日記

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

Goメモ-479 (slogメモ-03)(デフォルトロガー)

関連記事

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

参考情報

Goのおすすめ書籍


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

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