设为首页 收藏本站
查看: 1115|回复: 0

[经验分享] 设计自用的golang日志模块

[复制链接]

尚未签到

发表于 2018-9-20 11:51:04 | 显示全部楼层 |阅读模式
设计自用的golang日志模块
  golang的原生日志模块不能满足需求,而开源的第三方包,也不完全够用。用户较多的logrus,却没有rotate功能,这已经是众所周知的。对于运维来说,当然是希望日志的处理中比较简单、实用、够用。不需要额外的通过系统来实现logrotate。

1、需求
  从需求方面来说,主要有几个方面:
  一方面肯定是需要有轮转功能,而且要限制保留的日志份数。至于是按文件大小,还是按天、按小时切割,则可以讨论。
  另一方面,对于日志的级别,如果能够动态调整,则方便日志关闭常规日志,在线调试时,动态降低日志的等级,打印更多debug日志。

2、调研
  目前主要的有几个:


  • github.com/sirupsen/logrus。用户广泛,但明确表示不支持日志切割功能,建议通过hook走日志系统。
  • github.com/natefinch/lumberjack。支持以文件大小的方式切割日志。用户偏少。
  • gopkg.in/inconshreveable/log15.v2。比较老牌。
  • github.com/lestrrat-go/file-rotatelogs。基于小时数进行切割的小众包。
  • github.com/xiaomi-tc/log15。小米基于log15写的二次封装增加了切割功能。但只有2星。
  • 有前同事基于log15写的二次封装,但log15.v2/ext的包不太容易理解。
  • github.com/ngaut/log。完全不依赖第三方包。可基于日期及小时进行切割。
  综上,ngaut比较适合学习和了解封装过程。而基于logrus则是比较靠谱的选择,底层需要其他包实现的切割功能。

3、功能设计
  主要点:


  • 由logrus来完成日志功能。
  • 需要完成日志切割,历史日志需要压缩
  • 支持参考Go代码遇到的问题提供的level热更新
3.1 基于file-rotatelogs实现
  即基于日期的日志轮转。
  代码:github.com/jungle85gopy/rotlogs/daterot
  示例代码:参考github.com/jungle85gopy/rotlogs/example/date/date.go
  两个不足之处:


  • 该库没有压缩功能。
  • 日志目录对相对路径不友好。

    • 比如使用log/access.log时。log/access.log是个软链,链接到带日志的文件。

  

# ls -l log  
lrwxr-xr-x  1 song  staff    28 Mar  8 13:23 access.log -> log/access.log.20180308-1323
  
-rw-r--r--  1 song  staff  2511 Mar  8 13:23 access.log.20180308-1323
  

  
# tail log/access.log
  
tail: log/access.log: No such file or directory
  

  解决办法之一就是不使用软链,将是不主动设置BaseLinkName变量。

3.2 基于lumberjack实现
  即基于文件大小的日志轮转。
  代码:github.com/jungle85gopy/rotlogs
  示例代码:参考github.com/jungle85gopy/rotlogs/example/size/size.go
  这个版本的不足之处,在于日志切割后日志,其文件名过于复杂。可能不便后后继处理
  

# ls -l log  
abcd-2018-03-08T14-09-31.066.log.gz
  
abcd-2018-03-08T14-26-18.794.log.gz
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598836-1-1.html 上篇帖子: golang数据传输格式 下篇帖子: Golang的格式化输出fmt.Printf
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表