いろいろ備忘録日記

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

Goメモ-480 (slogメモ-04)(従来のlogパッケージとの連携)

関連記事

Goメモ-477 (slogメモ-01)(基本的な使い方) - いろいろ備忘録日記

Goメモ-478 (slogメモ-02)(構造化ログの出力) - いろいろ備忘録日記

Goメモ-479 (slogメモ-03)(デフォルトロガー) - いろいろ備忘録日記

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

今更ながら、Go 1.21で導入された log/slog を使ってみたりしています。

少しづつメモしていきます。今回は従来のlogパッケージとの連携について。

サンプル

package main

import (
    "context"
    "log"
    "log/slog"
    "os"
)

type (
    SlogWriter struct {
        logger *slog.Logger
        level  slog.Level
    }
)

func (me *SlogWriter) Write(p []byte) (int, error) {
    me.logger.Log(context.Background(), me.level, string(p))
    return len(p), nil
}

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パッケージは、従来のlogパッケージと共存できるように設計されている。
    // これにより、既存のコードベースを段階的に移行したり、サードパーティライブラリとの互換性を維持したりすることが可能。
    //
    // リンクロガーを利用する場合は、slog.NewLogLogger() を用いる。
    // この *log.Logger 経由でログ出力すると、内部でslogを通じて出力されることになる。
    //

    var (
        opt        = &slog.HandlerOptions{Level: slog.LevelDebug}
        handler    = slog.NewTextHandler(os.Stdout, opt)
        logger     = slog.New(handler)
        linkLogger = slog.NewLogLogger(handler, slog.LevelInfo)
    )

    logger.Debug("[SLOG] HELLO WORLD")
    linkLogger.Println("[LOG ] HELLO WORLD")

    //
    // 上とは別のやり方として、io.Writerを実装した状態にして
    // log.New() で渡して利用するというやり方も出来る。
    //
    // ただし、この場合、出力先として指定しているので
    // 通常の log.Print() の処理を通り、メッセージの末尾に 改行(\n) が追加される。
    //

    var (
        writer      = &SlogWriter{logger, slog.LevelDebug}
        linkLogger2 = log.New(writer, "", 0)
    )

    linkLogger2.Print("[LOG2] HELLO WORLD")

    return nil
}

実行すると以下のように出力されます。

$ task
task: [default] go run .
time=2024-09-26T08:00:17.412Z level=DEBUG msg="[SLOG] HELLO WORLD"
time=2024-09-26T08:00:17.412Z level=INFO msg="[LOG ] HELLO WORLD"
time=2024-09-26T08:00:17.412Z level=DEBUG msg="[LOG2] HELLO WORLD\n"

try-golang/examples/slog at main · devlights/try-golang · GitHub

参考情報

Goのおすすめ書籍


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

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