前言
Golang官方在1.21版本提供了实验性的日志库exp/slog,旨在提供更高级、更灵活的日志记录功能。本文将简介其特性、常见基础用法。
在1.21前,因为标准库太过于简单,比如缺少:
- 日志分级: 比如Error、Warn、Info、Debug
- 结构化: 比如Json、Xml
- 拓展性等 经过n年,官方终于给出了新的统一标准库,让我们看看slog做了对这些特性的支持。
Quick Start
升级Golang版本1.21,引入log/slog
"log/slog"
或者安装
go get golang.org/x/exp/slog
以一个简单的记录http请求的例子,来看看slog是如何使用的
package main
import (
"net/http"
"os"
"time"
"golang.org/x/exp/slog"
//"log/slog"
)
func main() {
r, _ := http.NewRequest("GET", "localhost", nil)
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: RemoveTime}))
slog.SetDefault(logger)
slog.Info("finished",
slog.Group("req",
slog.String("method", r.Method),
slog.String("url", r.URL.String())),
slog.Int("status", http.StatusOK),
slog.Duration("duration", time.Second))
}
func RemoveTime(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{}
}
return a
}
// Output:
// level=INFO msg=finished req.method=GET req.url=localhost status=200 duration=1s
上例中,首先,需要New一个Logger对象,其次,调用Info来记录一组Group不同数据类型Int、Duration。
不同的日志等级
接着我们来实验slog对不同日志等级的支持:
logger.Debug("This is a debug message")
logger.Info("This is an info message")
logger.Warn("This is a warning message")
logger.Error("This is an error message")
//OUTPUT
//level=INFO msg="This is an info message"
//level=WARN msg="This is a warning message"
//level=ERROR msg="This is an error message"
结构化日志
exp/slog还支持使用结构化日志,比如我们可以把日志输出格式改为Json
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: RemoveTime}))
//OUTPUT
{"level":"INFO","msg":"finished","req":{"method":"GET","url":"localhost"},"status":200,"duration":1000000000}
总结
exp/slog是Golang官方提供的实验性日志库,具有区分不同错误等级、结构化等更高级、灵活的特性,更多特性在后续持续更新。