Golang zap和lumberjack实现日志存储和自动管理
期望实现功能
按不同的日志级别存储到不同的日志文件中(这里只实现了info和error级别)
控制最多保留的日志文件及保留最近多少天的日志文件(控制日志的最大磁盘使用量)
控制每个日志文件的大小
我们使用zap和lumberjack框架实现
go get -u go.uber.org/zap
go get gopkg.in/natefinch/lumberjack.v2
lumberjack的Logger结构体如下
type Logger struct {//写日志的文件名称Filename string `json:"filename" yaml:"filename"`//每个日志文件长度的最大大小,默认100M。MaxSize int `json:"maxsize" yaml:"maxsize"`//日志保留的最大天数(只保留最近多少天的日志)MaxAge int `json:"maxage" yaml:"maxage"`//只保留最近多少个日志文件,用于控制程序总日志的大小MaxBackups int `json:"maxbackups" yaml:"maxbackups"`//是否使用本地时间,默认使用UTC时间LocalTime bool `json:"localtime" yaml:"localtime"`// 是否压缩日志文件,压缩方法gzipCompress bool `json:"compress" yaml:"compress"`size int64 //记录当前日志文件的字节数file *os.File //当前的日志文件mu sync.MutexmillCh chan boolstartMill sync.Once
}
lumberjack的使用及源码可参考:https://mp.csdn.net/console/editor/html/107142274
示例
package applogimport("strings""path/filepath""go.uber.org/zap""go.uber.org/zap/zapcore""gopkg.in/natefinch/lumberjack.v2"
)var (infoLevel = "info"errorLevel = "error"debugLevel = "debug"
)func NewLog(dir, prefix,level string,maxSize,maxBackups,maxAge int) (*zap.Logger, func(),error) {if maxSize < 0 {maxSize = 0}if maxBackups < 0 {maxBackups = 0}if maxAge < 0 {maxAge = 0}infoLog := &lumberjack.Logger{Filename: getFilePath(dir, prefix, infoLevel),MaxSize: maxSize,MaxBackups: maxBackups,MaxAge: maxAge,LocalTime: true,Compress: false,}errLog := &lumberjack.Logger{Filename: getFilePath(dir, prefix, errorLevel),MaxSize: maxSize,MaxBackups: maxBackups,MaxAge: maxAge,LocalTime: true,Compress: false,}cronLogger := &lumberLog{dir:dir,prefix: prefix,level: level,infoLog: infoLog,errLog: errLog,}return cronLogger.getLoggerWithCron(), func() {cronLogger.StopLogger()},nil
}func (l *lumberLog) rotate() {if l.infoLog != nil {l.infoLog.Rotate()}if l.errLog != nil {l.errLog.Rotate()}
}type lumberLog struct {dir stringprefix stringlevel stringinfoLog *lumberjack.LoggererrLog *lumberjack.Logger
}func (l *lumberLog) StopLogger() {l.infoLog.Close()l.errLog.Close()
}func (l *lumberLog)getLoggerWithCron() (*zap.Logger) {highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool{return lev >= zap.ErrorLevel})lowLevel := zap.InfoLevelif strings.EqualFold(l.level,debugLevel) {lowLevel = zap.DebugLevel}lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {return lev < zap.ErrorLevel && lev >= lowLevel})prodEncoder := zap.NewProductionEncoderConfig()prodEncoder.EncodeTime = zapcore.ISO8601TimeEncoderprodEncoder.CallerKey = ""highCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.errLog),highPriority)lowCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.infoLog),lowPriority)return zap.New(zapcore.NewTee(highCore,lowCore))
}func getFilePath(dir, prefile, level string) string {return filepath.Join(dir,level,prefile+"-"+level)+".log"
}
Golang zap和lumberjack实现日志存储和自动管理相关推荐
- Golang一日一库之 日志库 zap
简介 在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了. zap 是开源的 Go 高性能日志库 主要有以下特点: 支 ...
- go第三方日志库uber-go/zap、lumberjack
uber-go/zap.lumberjack zap是uber开源的go语言高性能日志库, lumberjack是zap官方推荐的日志分割库, 结合这两个库我们可以在项目中实现完整的日志机制, 例如: ...
- golang : Zap日志整合
1.目录结构 项目名称 --------------main.go --------------setting.json --------------common ------------------ ...
- Golang zap 快速上手
文章目录 1.zap 是什么? 2.zap 快速上手 1.安装 Zap 2.创建 Logger 3.配置 Logger 4.记录日志 5.输出日志 6.添加 Caller 信息 3.日志滚动 4.小结 ...
- Gin框架组合(Zap、lumberjack、ini)使用手册
Gin Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本.具有快速灵活,容错方便等特点.其实对于golang而言,web框架的依赖要远比Python, ...
- 使用Lumberjack进行日志切割归档
使用Lumberjack进行日志切割归档 文章目录 使用Lumberjack进行日志切割归档 安装 zap logger中加入Lumberjack 测试所有功能 上述程序中唯一缺少的就是日志切割归档功 ...
- Python logging模块日志存储位置踩坑
问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个 ...
- 日志长度_Kafka 日志存储详解
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:爱宝贝丶 my.oschina.net/zhangxufeng/blog/31141 ...
- Exchange 日志/存储路径
日志/存储路径 http://szzb-ad-360:8181/help/admin/scheduling/log-path.html 使用"日志/存储路径"选项,用户可以编辑默认 ...
最新文章
- 从专利数量看全球最具创新力的50家公司
- 汇编语言 判断学生成绩是否及格
- 从 Alpha 到 Beta,这次是 New mPaaS
- html逻辑判断符,JavaScript中的逻辑判断符、||与!介绍
- 关于敏捷开发方法(Agile Software Development)的阅读笔记
- Redis调用及使用
- GDUFE ACM-1045
- )标识符不能是c语言的关键字,标识符不能是C的关键字
- 标准RTSP 消息的错误代码
- 友情提示!距离CVPR 2020截稿还剩2天!
- pycharm 快捷键设置为eclipse一样
- 【转载】实用的人际关系经验
- UDP网络编程核心类
- PDFDOC365工具箱
- ADB连接手机遇到的问题:list of devices attached
- android studio使用NanoHTTPD 创建 http 服务器打开html并使用webView打开页面
- web打印的最佳方案
- google gflags使用指南
- 码农:一次项目经历改掉了我代码洁癖,由4年小兵升为技术leader
- 数字化转型:信息系统的生命周期(一)
热门文章
- 论浏览器冲突引起的桌面和任务栏图标一直闪的解决办法
- android 三种常用的加密方式
- ARM Linux设备树
- “项目负责人”及“分项目负责人”职责
- 字节(byte)、位(bit)、KB、B、字符之间关系以及编码占用位数
- 怎么设置计算机的开机音乐,Xp电脑怎么设置开关机音乐|xp系统如何修改开机音乐...
- 六类网线钳能压五类水晶头吗_六类网线钳能压五类水晶头吗_网线水晶头线序的接法解析...
- JavaScript实现网页关灯效果
- 利用SLR实现可编程计算器(表达式求值)
- 打开计算机窗口的快捷键是什么,快速切换窗口的快捷键是什么