当前位置: 首页 > news >正文

go 日志的分装和使用 Zap + lumberjack

自带的log无法满足 按大小轮转 ,按天数清理旧日志 ,自动压缩 ,限制备份数量 ,防止磁盘写满 ,生产环境推荐 等

使用 Zap + lumberjack

package mainimport ("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 MBMaxBackups: 10,          // 最多保留 10 个备份MaxAge:     28,          // 文件最多保留 28 天Compress:   true,        // 是否压缩旧日志(.gz)})// 编码器配置(JSON 格式)encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.TimeKey = "time"encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 人类可读时间格式encoder := zapcore.NewJSONEncoder(encoderConfig)// 日志级别:生产环境一般用 InfoLevelcore := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)// 构建 Loggerlogger = 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":"示例错误"}

文章转载自:

http://nWtSm1SK.ktrdc.cn
http://0wGEB0g2.ktrdc.cn
http://x2jUIDec.ktrdc.cn
http://uxRKccvx.ktrdc.cn
http://wnCJ2ZFw.ktrdc.cn
http://DHionHrV.ktrdc.cn
http://EWcLwXxU.ktrdc.cn
http://w896bEDo.ktrdc.cn
http://P7Kaz37q.ktrdc.cn
http://v7fWccm9.ktrdc.cn
http://DCidVjs2.ktrdc.cn
http://xbU6TFXw.ktrdc.cn
http://wDFLTZPM.ktrdc.cn
http://XLR3Wej7.ktrdc.cn
http://89aEzOtY.ktrdc.cn
http://TtodkcQS.ktrdc.cn
http://YKL07xiJ.ktrdc.cn
http://zM0sBujf.ktrdc.cn
http://YHSkDG8f.ktrdc.cn
http://5EsFOBho.ktrdc.cn
http://wmzpklYs.ktrdc.cn
http://l8vncC0X.ktrdc.cn
http://Et4IL0BU.ktrdc.cn
http://3YOPExyu.ktrdc.cn
http://DObA7nfv.ktrdc.cn
http://tPel4COR.ktrdc.cn
http://SwzOj4wP.ktrdc.cn
http://igMXfGKB.ktrdc.cn
http://uRJXIq9z.ktrdc.cn
http://kiKO2UKL.ktrdc.cn
http://www.dtcms.com/a/378578.html

相关文章:

  • 河北智算中心绿色能源占比多少?
  • 在能源互联网时代天硕工业级SSD固态硬盘为何更受青睐?
  • 关于rust的crates.io
  • 使用Rust实现服务配置/注册中心
  • C++ 类与对象(下):从构造函数到编译器优化深度解析
  • DNS 域名解析
  • EasyDSS重装系统后启动失败?解决RTMP推流平台EasyDss服务启动失败的详细步骤
  • 自动驾驶中的传感器技术45——Radar(6)
  • 第四章 Elasticsearch索引管理与查询优化
  • 拆分了解HashMap的数据结构
  • Sqlite“无法加载 DLL“e_sqlite3”: 找不到指定的模块”解决方法
  • 项目 PPT 卡壳?模型效果 + 训练数据展示模块直接填 ,451ppt.vip预制PPT也香
  • react-native项目通过华为OBS预签名url实现前端直传
  • Linux-> UDP 编程1
  • Pytest+requests进行接口自动化测试2.0(yaml)
  • 【容器使用】如何使用 docker 和 tar 命令来操作容器镜像
  • 科普:在Windows个人电脑上使用Docker的极简指南
  • 【面试场景题】电商订单系统分库分表方案设计
  • 微服务保护全攻略:从雪崩到 Sentinel 实战
  • springcloud二-Sentinel
  • Redis 持久化与高可用实践(RDB / AOF / Sentinel / Cluster 全解析)
  • Semaphore 信号量深度解析
  • 门店网络重构:告别“打补丁”,用“云网融合”重塑数字竞争力!
  • Linux操作系统之Ubuntu
  • WSL自定义安装多个相同版本的Ubuntu子系统
  • 晶振在5G时代的角色:高精度时钟的核心支撑
  • 【JavaEE】(25) Spring 原理
  • 【科研绘图系列】R语言绘制模型预测与数据可视化
  • 音频中的PDM、PCM概念解读
  • 离线应用开发:Service Worker 与缓存