探索 Go slog 标准库:设计与应用

本文主要介绍了 Go 语言新引入的 log/slog 标准库的设计理念、使用方法以及如何进行定制化开发,以提高日志操作的性能和灵活性。原文: Explore the Go slog Standard Library: Design and Usage

alt

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定义日志输出格式,默认实现为 TextHandlerJSONHandlerRecord定义日志的详细信息,如时间、级别等。这些接口不仅能以多种方式扩展 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

通过下面的代码,我们可以将默认打印方式修改为内置的 TextHandlerJSONHandler

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}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俞凡 DeepNoMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值