方案
通过 log/slog
实现结构化日志生成,这是go1.21中推出的新特性;通过 lumberjack
实现日志文件分割。
示例
package main
import (
"gopkg.in/natefinch/lumberjack.v2"
"log/slog"
"os"
"path/filepath"
)
func main() {
r := &lumberjack.Logger{
Filename: filepath.Base(os.Args[0]) + ".log",
LocalTime: true,
MaxSize: 1,
MaxAge: 3,
MaxBackups: 5,
Compress: true,
}
logger := slog.New(slog.NewJSONHandler(r, nil))
slog.SetDefault(logger)
slog.Info("start app")
参数说明
lumberjack.Logger
type Logger struct {
// Filename 是用来写入日志的文件。旋转的日志文件将被保留在同一目录中。
// 如果 Filename 为空,它将使用 os.TempDir() 中的 <processname>-lumberjack.log 文件。
Filename string `json:"filename" yaml:"filename"`
// MaxSize 是日志文件在进行轮转之前的最大大小(以兆字节为单位)。默认为100兆字节。
MaxSize int `json:"maxsize" yaml:"maxsize"`
// MaxAge 是根据文件名中的时间戳编码来保留旧日志文件的最大天数。请注意,一天定义为24小时,可能由于夏令时、闰秒等原因与日历天数不完全对应。
// 默认情况下,不根据年龄删除旧的日志文件。
MaxAge int `json:"maxage" yaml:"maxage"`
// MaxBackups 是要保留的旧日志文件的最大数量。默认情况下,保留所有旧的日志文件(尽管 MaxAge 可能仍会导致它们被删除)。
MaxBackups int `json:"maxbackups" yaml:"maxbackups"`
// LocalTime 确定备份文件中时间戳格式化所使用的时间是否为计算机的本地时间。默认情况下,使用 UTC 时间。
LocalTime bool `json:"localtime" yaml:"localtime"`
// Compress 确定是否使用 gzip 对轮转的日志文件进行压缩。默认情况下,不执行压缩。
Compress bool `json:"compress" yaml:"compress"`
// 包含过滤或未导出的字段
}
参考
lumberjack package - gopkg.in/natefinch/lumberjack.v2 - Go Packages