自带的log无法满足 按大小轮转 ,按天数清理旧日志 ,自动压缩 ,限制备份数量 ,防止磁盘写满 ,生产环境推荐 等
使用 Zap + lumberjack
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
"path/filepath"
)
var logger *zap.Logger
// 初始化日志配置
func InitLogger() {
// 确保 log 目录存在
logDir := "log"
if err := os.MkdirAll(logDir, 0755); err != nil {
panic("无法创建日志目录: " + err.Error())
}
// 日志文件路径
logFilePath := filepath.Join(logDir, "app.log")
//每天一个文件
logName := time.Now().Format("2006-01-02")
logFilePath := filepath.Join(logDir, fmt.Sprintf("%v.log", logName))
// lumberjack 配置:日志轮转
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: logFilePath, // 日志文件路径
MaxSize: 100, // 单文件最大 100 MB
MaxBackups: 10, // 最多保留 10 个备份
MaxAge: 28, // 文件最多保留 28 天
Compress: true, // 是否压缩旧日志(.gz)
})
// 编码器配置(JSON 格式)
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "time"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 人类可读时间格式
encoder := zapcore.NewJSONEncoder(encoderConfig)
// 日志级别:生产环境一般用 InfoLevel
core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)
// 构建 Logger
logger = zap.New(core, zap.AddCaller()) // 可选:添加调用位置
}
// 获取 Logger 实例
func GetLogger() *zap.Logger {
return logger
}
// 确保日志缓冲区落盘
func SyncLogger() {
if logger != nil {
logger.Sync()
}
}
// 示例错误
var ErrExample = &MyError{Msg: "示例错误"}
// 自定义错误类型
type MyError struct {
Msg string
}
// 实现 error 接口
func (e *MyError) Error() string {
return e.Msg
}
func main() {
InitLogger()
defer SyncLogger() // 确保缓冲区日志落盘
log := GetLogger()
log.Info("服务启动成功",
zap.String("version", "1.0.0"),
zap.Int("port", 8080),
)
log.Warn("这是一个警告",
zap.String("reason", "磁盘空间不足"),
)
log.Error("发生错误",
zap.Error(ErrExample),
)
}
结果配置如下
{"level":"info","time":"2025-09-11T16:13:12.515+0800","caller":"test/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:80","msg":"发生错误","error":"示例错误"}
{"level":"info","time":"2025-09-11T16:20:18.157+0800","caller":"logger/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:80","msg":"发生错误","error":"示例错误"}
{"level":"info","time":"2025-09-11T16:20:27.451+0800","caller":"logger/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:80","msg":"发生错误","error":"示例错误"}