Go バイ例: ロギング

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

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

log パッケージからの Println などの関数を呼び出すだけで、標準のロガーを使用します。これは os.Stderr への適切なログ出力用にあらかじめ構成されています。Fatal* または Panic* などの追加メソッドは、ログ出力後にプログラムを終了します。

    log.Println("standard logger")

ロガーは出力形式を設定するための フラグ を使用して構成できます。デフォルトでは、標準ロガーには log.Ldatelog.Ltime フラグが設定されており、これらは log.LstdFlags に収集されます。例えば、時間のフラグを変更してマイクロ秒の精度で時間を送信できます。

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

log 関数が呼び出されるファイル名と行を送信することもサポートします。

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

カスタムロガーを作成して渡すことが役に立つ場合があります。新しいロガーを作成するときに、プレフィックス を設定して他のロガーからの出力を区別できます。

    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}

次の例: HTTP Client