slog 基本介绍
导入包 import “log/slog”
slog内容比较简洁,核心组件有三项,分别是Logger, Record, Handler。用户调用Logger 提供的日志记录方法 Info 记录一条日志,Info 方法会调用一个私有方法 log,log 方法内部会使用 NewRecord 创建一个日志条目 Record,最终Logger 会调用其嵌入的 Handler 对象的 Handle 方法解析 Record 并执行日志记录逻辑。
slog配置日志切割
slog本身不具备日志切割功能,需要引入第三方库lumberjack。lumberjack是一个日志滚动记录器,写入lumberjack的日志达到一定的条件后会进行存档。但是lumberjack本身不具备日志的基础功能,例如日志等级等。一般情况下,lumberjack可以配合其他日志库综合实现需要的功能。
首先为lumberjackLogger赋值,并将其传入handler方法,实现日志切割。
lumberjackLogger := &lumberjack.Logger{
Filename: "logs/test.log", // 日志文件名
MaxSize: 10, // 单个日志文件最大大小(MB)
MaxBackups: 7, // 最多保留多少个备份文件
MaxAge: 1, // 文件最多保存多少天
Compress: true, // 是否压缩旧文件
}
fileHandler := slog.NewTextHandler(lumberjackLogger, "")
slog.SetDefault(slog.New(fileHandler))
slog配置日志级别
日志级别主要包括debug,info,warn,error四种级别,其中debug级别为最低级别。level.Set()方法可以设置日志级别,opts后续传入handler方法实现日志级别控制。
//初始化level
var level = new(slog.LevelVar)
switch conf.Level {
case "DEBUG":
level.Set(slog.LevelDebug)
case "INFO":
level.Set(slog.LevelInfo)
case "WARN":
level.Set(slog.LevelWarn)
case "ERROR":
level.Set(slog.LevelError)
default:
level.Set(slog.LevelInfo)
}
opts := &slog.HandlerOptions{Level: level}
consoleHandler := slog.NewTextHandler(os.Stdout, opts)
slog配置日志输出方式
日志输出方式一般为文件和控制台输出两种方式,slog通过传入handler函数不同参数用于区分,比如文件输出传入lumberjackLogger,控制台输出传入os.Stdout。slog.SetDefault()方法可以设置全局日志实例。
//设置日志输出方式
//日志文件输出
if conf.Output == "file" {
fileHandler := slog.NewTextHandler(lumberjackLogger, opts)
slog.SetDefault(slog.New(fileHandler))
} else {
//日志控制台输出
consoleHandler := slog.NewTextHandler(os.Stdout, opts)
slog.SetDefault(slog.New(consoleHandler))
}
代码示例
func InitLogger() {
conf := &LogConfig{
FileName: "logs/test.log",
MaxSize: 10,
MaxBackups: 7,
MaxAge: 1,
Compress: true,
Level: "DEBUG",
Output: "file",
}
//设置日志级别
var level = new(slog.LevelVar)
switch conf.Level {
case "DEBUG":
level.Set(slog.LevelDebug)
case "INFO":
level.Set(slog.LevelInfo)
case "WARN":
level.Set(slog.LevelWarn)
case "ERROR":
level.Set(slog.LevelError)
default:
level.Set(slog.LevelInfo)
}
opts := &slog.HandlerOptions{Level: level}
//设置日志切割
lumberjackLogger := &lumberjack.Logger{
Filename: conf.FileName, // 日志文件名
MaxSize: conf.MaxSize, // 单个日志文件最大大小(MB)
MaxBackups: conf.MaxBackups, // 最多保留多少个备份文件
MaxAge: conf.MaxAge, // 文件最多保存多少天
Compress: conf.Compress, // 是否压缩旧文件
}
//设置日志输出方式
if conf.Output == "file" {
//日志文件输出
fileHandler := slog.NewTextHandler(lumberjackLogger, opts)
slog.SetDefault(slog.New(fileHandler))
} else {
//日志控制台输出
consoleHandler := slog.NewTextHandler(os.Stdout, opts)
slog.SetDefault(slog.New(consoleHandler))
}
}