Go by Example: Logging

Go の標準ライブラリは、Go プログラムからログを出力するための 簡単なツールを提供します。自由形式のログには log パッケージを、構造化ログには log/slog パッケージを使えます。

package main
import (
    "bytes"
    "fmt"
    "log"
    "os"
    "log/slog"
)
func main() {

log パッケージの Println などの関数を呼び出すと、 すでに設定済みの 標準 ロガーを使って、os.Stderr に適切なログを出力できます。Fatal*Panic* などのメソッドは、ログ出力の後にプログラムを終了します。

    log.Println("standard logger")

ロガーは、フラグ (flag) を使用して出力形式を設定できます。 デフォルトでは、標準ロガーには log.Ldatelog.Ltime フラグが設定されていて、これは log.LstdFlags と同等です。 例えば、ミリ秒精度で時間を出力するようにフラグを変更できます。

    log.SetFlags(log.LstdFlags | log.Lmicroseconds)
    log.Println("with micro")

呼び出し元のファイル名と行番号を出力する設定もできます。

    log.SetFlags(log.LstdFlags | log.Lshortfile)
    log.Println("with file/line")

カスタムロガーを作成して利用することも有用です。 新しいロガーを作成するときに、他のロガーの出力と区別しやすいよう 接頭辞 (prefix) を設定できます。

    mylog := log.New(os.Stdout, "my:", log.LstdFlags)
    mylog.Println("from mylog")

既存のロガー(標準ロガーを含む)の接頭辞は、SetPrefix メソッドで設定できます。

    mylog.SetPrefix("ohmy:")
    mylog.Println("from mylog")

ロガーは、カスタムの出力先を設定できます。 任意の io.Writer が使えます。

    var buf bytes.Buffer
    buflog := log.New(&buf, "buf:", log.LstdFlags)

この呼び出しは、ログ出力を buf に書き込みます。

    buflog.Println("hello")

これにより、標準出力に実際の出力が表示されます。

    fmt.Print("from buflog:", buf.String())

slog パッケージは、構造化された ログ出力を提供します。 例えば、JSON 形式のログ出力が簡単に実現できます。

    jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
    myslog := slog.New(jsonHandler)
    myslog.Info("hi there")

メッセージに加えて、slog の出力には任意のキーと値のペアを 含めることができます。

    myslog.Info("hello again", "key", "val", "age", 25)
}

サンプル出力です。日付と時刻は、実行日時に依存します。

$ go run logging.go
2023/08/22 10:45:16 standard logger
2023/08/22 10:45:16.904141 with micro
2023/08/22 10:45:16 logging.go:40: with file/line
my:2023/08/22 10:45:16 from mylog
ohmy:2023/08/22 10:45:16 from mylog
from buflog:buf:2023/08/22 10:45:16 hello

これらはウェブサイト上で見やすくするために折り返しています。 実際には1行で出力されます。

{"time":"2023-08-22T10:45:16.904166391-07:00",
 "level":"INFO","msg":"hi there"}
{"time":"2023-08-22T10:45:16.904178985-07:00",
    "level":"INFO","msg":"hello again",
    "key":"val","age":25}

Next example: HTTP Client.