在 Go 1.21 中,引入了一个新的 log 包 -- log/slog,这是一个强大的日志记录库,提供了许多用于帮助开发人员更加有效地记录、管理和理解日志的工具。无论你是一个初级还是高级的 Go 开发人员,理解和掌控 go 的日志系统是非常有用的。接下来,让我们深入研究一下 Go 中的日志行为,并通过实例来详细理解每个主要功能。
安装
在 Go 1.21 中,log/slog 是系统自带的,无需安装。只需在代码顶部加上 import "log/slog" 即可使用。
package main
import "log/slog"
初始化
在 Go 1.21 的标准库中,log/slog 的初始化非常直观。以下是一个简单初始化示例:
package main
import "log/slog"
func main() {
log := slog.New()
}
这将创建一个新的公共日志记录器,此记录器具有默认的日志级别(ERROR),但您可以使用 SetLevel 方法来修改这个级别。
设置日志级别
log/slog 提供了设置日志级别的方法。包括:DEBUG,INFO,WARNING,ERROR,FATAL。以下为设置日志级别的示例:
package main
import "log/slog"
func main() {
log := slog.New()
log.SetLevel(slog.DEBUG)
}
在这里,我们把默认的日志级别从 ERROR 设置为 DEBUG。
日志输出
package main
import "log/slog"
func main() {
log := slog.New()
log.SetLevel(slog.DEBUG)
log.Debug("this is a debug message")
log.Info("this is an info message")
log.Warning("this is a warning message")
log.Error("this is an error message")
}
以上代码,我们会看到所有的信息都会被打印出来。因为我们把日志等级设置成了 DEBUG, 这是最低级别的,所以所有的日志信息都会被打印出来。
自定义日志格式
log/slog 提供了 Formatter 接口,允许你自定义日志的格式。你可以通过实现这个接口,创建自己的 Formatter。
package main
import (
"log/slog"
"os"
"time"
)
type MyFormatter struct{}
func (f *MyFormatter) Format(entry *slog.Entry) ([]byte, error) {
return []byte(fmt.Sprintf("%s [%s] %s\n", entry.Time.Format(time.RFC3339), entry.Level.String(), entry.Message), nil
}
func main() {
log := slog.New()
log.SetFormatter(&MyFormatter{})
log.SetLevel(slog.DEBUG)
log.SetOutput(os.Stdout)
log.Debug("this is a debug message")
log.Info("this is an info message")
log.Warning("this is a warning message")
log.Error("this is an error message")
}
以上是自定义日志格式的示例,我们创建了一个新的 Formatter, 将日志格式设置为 [时间] [级别] 信息。
结语
以上就是 Go 1.21 标准库 log/slog 的基本介绍和使用方法。希望这篇文章能帮助你更好地理解和使用 Go 的日志系统,高效地处理你的日志任务。