本文主要介绍了 Go 语言新引入的
log/slog标准库的设计理念、使用方法以及如何进行定制化开发,以提高日志操作的性能和灵活性。原文: Explore the Go slog Standard Library: Design and Usage
在 Go1.21 中引入的 log/slog 软件包试图弥补原有日志软件包的不足,即日志缺乏结构化和级别特性。正如提案[1]中提到的,log/slog 包旨在创建一个零依赖、易用、高性能、灵活高效的日志系统。如果你对它的概念感兴趣,并想更好的利用它,那就请跟随我深入了解它的设计、实现和应用。
slog设计
为实现其目的,slog 的设计具有高度灵活性。它支持结构化日志,能以 JSON 或其他格式输出日志,以便后续分析和处理。出色的模块化设计将日志功能分为多个组件,如日志级别管理、输出格式化、日志传输等,每个组件都可以独立配置和替换。其异步处理支持机制可确保日志操作不会阻碍主应用程序的执行。
// Logger contains all actions against a Log message
type Logger struct {
New(h Handler) *Logger
Debug(msg string, args ...any)
Error(msg string, args ...any)
Info(msg string, args ...any)
//...
With(args ...any) *Logger
}
// Handler defines how to
type Handler interface {
Handle(context.Context, Record) error
WithAttrs(attrs []Attr) Handler
WithGroup(name string) Handler
}
// Record defines a Log message with many info。
type Record struct {
Time time.Time
Message string
Level Level
PC uintptr
}
三个组件完成了整个流程。
Logger负责所有日志打印操作。Handler定义日志输出格式,默认实现为 TextHandler 和 JSONHandler。Record定义日志的详细信息,如时间、级别等。这些接口不仅能以多种方式扩展 slog(如添加新的处理程序),还能满足不同日志框架的需求和配置。
slog用法
slog 的基本用法与 zap 或 Golang 的其他第三方日志框架类似。
日志打印
func main() {
slog.Info("This is an informational message.")
slog.Warn("This is a warning message with context.", slog.String("user", "slaise"))
slog.Error("This is an error message with details.", slog.Int("code", 123))
}
// output(go-playground) https://go.dev/play/p/TLIur7rZFhi
2009/11/10 23:00:00 INFO This is an informational message.
2009/11/10 23:00:00 WARN This is a warning message with context. user=slaise
2009/11/10 23:00:00 ERROR This is an error message with details. code=123
slog 为不同级别的日志提供了不同的打印方式和相应的参数类型转换。
Handler
通过下面的代码,我们可以将默认打印方式修改为内置的 TextHandler 或 JSONHandler。
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
// logger.Info/Debug/Error
请看输出结果。
// JSONHandler
func main() {
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("This is an informational message.")
logger.Warn("This is a warning message with context.", slog.String("user", "slaise"))
logger.Error("This is an error message with details.", slog.Int("code", 123))
}
// Output: https://go.dev/play/p/oCubHk77Sjw
{
"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"This is an informational message."}
{
"time":"2009-11-10T23:00:00Z","level":"WARN","msg":"This is a warning message with context.","user":"slaise"}
{
"time":"2009-11-10T23:00:00Z","level":"ERROR","msg":"This is an error message with details.","code":123}

最低0.47元/天 解锁文章
850

被折叠的 条评论
为什么被折叠?



