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")
// 可以通过设置标志来配置日志记录器的输出格式。默认情况下,标准日志记录器设置了 log.Ldate 和 log.Ltime 标志,这些标志被收集在 log.LstdFlags 中。例如,我们可以更改其标志以发出微秒精度的时间。
log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.Println("with micro")
// 它还支持发出调用日志函数的文件名和行号。
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 输出还可以包含任意数量的 key=value 对。
myslog.Info("hello again", "key", "val", "age", 25)
}
运行结果:
➜ go run logging.go
2025/01/20 14:14:03 standard logger
2025/01/20 14:14:03.298758 with micro
2025/01/20 14:14:03 logging.go:19: with file/line
my:2025/01/20 14:14:03 from mylog
ohmy:2025/01/20 14:14:03 from mylog
from buflog:buf:2025/01/20 14:14:03 hello
{"time":"2025-01-20T14:14:03.298799+08:00","level":"INFO","msg":"hi there"}
{"time":"2025-01-20T14:14:03.298807+08:00","level":"INFO","msg":"hello again","key":"val","age":25}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。