期望实现功能

按不同的日志级别存储到不同的日志文件中(这里只实现了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实现日志存储和自动管理相关推荐

  1. Golang一日一库之 日志库 zap

    简介 在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了. zap 是开源的 Go 高性能日志库 主要有以下特点: 支 ...

  2. go第三方日志库uber-go/zap、lumberjack

    uber-go/zap.lumberjack zap是uber开源的go语言高性能日志库, lumberjack是zap官方推荐的日志分割库, 结合这两个库我们可以在项目中实现完整的日志机制, 例如: ...

  3. golang : Zap日志整合

    1.目录结构 项目名称 --------------main.go --------------setting.json --------------common ------------------ ...

  4. Golang zap 快速上手

    文章目录 1.zap 是什么? 2.zap 快速上手 1.安装 Zap 2.创建 Logger 3.配置 Logger 4.记录日志 5.输出日志 6.添加 Caller 信息 3.日志滚动 4.小结 ...

  5. Gin框架组合(Zap、lumberjack、ini)使用手册

    Gin Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本.具有快速灵活,容错方便等特点.其实对于golang而言,web框架的依赖要远比Python, ...

  6. 使用Lumberjack进行日志切割归档

    使用Lumberjack进行日志切割归档 文章目录 使用Lumberjack进行日志切割归档 安装 zap logger中加入Lumberjack 测试所有功能 上述程序中唯一缺少的就是日志切割归档功 ...

  7. Python logging模块日志存储位置踩坑

    问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个 ...

  8. 日志长度_Kafka 日志存储详解

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:爱宝贝丶 my.oschina.net/zhangxufeng/blog/31141 ...

  9. Exchange 日志/存储路径

    日志/存储路径 http://szzb-ad-360:8181/help/admin/scheduling/log-path.html 使用"日志/存储路径"选项,用户可以编辑默认 ...

最新文章

  1. 从专利数量看全球最具创新力的50家公司
  2. 汇编语言 判断学生成绩是否及格
  3. 从 Alpha 到 Beta,这次是 New mPaaS
  4. html逻辑判断符,JavaScript中的逻辑判断符、||与!介绍
  5. 关于敏捷开发方法(Agile Software Development)的阅读笔记
  6. Redis调用及使用
  7. GDUFE ACM-1045
  8. )标识符不能是c语言的关键字,标识符不能是C的关键字
  9. 标准RTSP 消息的错误代码
  10. 友情提示!距离CVPR 2020截稿还剩2天!
  11. pycharm 快捷键设置为eclipse一样
  12. 【转载】实用的人际关系经验
  13. UDP网络编程核心类
  14. PDFDOC365工具箱
  15. ADB连接手机遇到的问题:list of devices attached
  16. android studio使用NanoHTTPD 创建 http 服务器打开html并使用webView打开页面
  17. web打印的最佳方案
  18. google gflags使用指南
  19. 码农:一次项目经历改掉了我代码洁癖,由4年小兵升为技术leader
  20. 数字化转型:信息系统的生命周期(一)

热门文章

  1. 论浏览器冲突引起的桌面和任务栏图标一直闪的解决办法
  2. android 三种常用的加密方式
  3. ARM Linux设备树
  4. “项目负责人”及“分项目负责人”职责
  5. 字节(byte)、位(bit)、KB、B、字符之间关系以及编码占用位数
  6. 怎么设置计算机的开机音乐,Xp电脑怎么设置开关机音乐|xp系统如何修改开机音乐...
  7. 六类网线钳能压五类水晶头吗_六类网线钳能压五类水晶头吗_网线水晶头线序的接法解析...
  8. JavaScript实现网页关灯效果
  9. 利用SLR实现可编程计算器(表达式求值)
  10. 打开计算机窗口的快捷键是什么,快速切换窗口的快捷键是什么