设计自用的golang日志模块
设计自用的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
设计自用的golang日志模块的更多相关文章
- golang 日志模块(log)
log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...
- ERP设计之系统基础管理(BS)-日志模块设计(转载)
原文地址:8.ERP设计之系统基础管理(BS)-日志模块设计作者:ShareERP 日志模块基本要素包括: 用户会话.登录.注销.模块加载/卸载.数据操作(增/删/改/审/弃/关等等).数据恢复.日志 ...
- step by step 之餐饮管理系统四(日志模块实现)
三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...
- 使用线程执行堆栈StackTraceElement设计Android日志模块
假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈 Java.lang包中 ...
- Android 利用线程运行栈StackTraceElement设计Android日志模块
如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢? 1.引入Java的线程运行栈 Java.lang包中 ...
- 【Gin-API系列】Gin中间件之日志模块(四)
日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...
- 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...
- ns3 Tutorial 中的日志模块(翻译)
转载地址:http://blog.sina.com.cn/s/blog_8ecca79b0101d7fe.html 1 日志模块的使用 在运行 first.cc 脚本时,我们已经简单 ...
- gorm的日志模块源码解析
gorm的日志模块源码解析 如何让gorm的日志按照我的格式进行输出 这个问题是<如何为gorm日志加traceId>之后,一个群里的朋友问我的.如何让gorm的sql日志不打印到控制台, ...
随机推荐
- 虚拟机安装master,克隆slave0、slave1(多台机相连,网络匹配)
1.在虚拟机中创建一个名叫master的主机 2.创建成功后,打开编辑选项——虚拟网络网络编辑器,填网关 3.打开终端,进入root权限,编写命令 设置虚拟机DNS 4.给master网络配置好后,克 ...
- HTTP协议通信原理 与常见报错信息
HTTP协议通信原理 请求报文 请求行 GET index.html HTTP 1.1 请求方法:get 读取服务器数据内容 post 提交存储服务端数据(用户注册) 协议版本: ht ...
- Python Multiprocessing 多进程,使用多核CPU计算 并使用tqdm显示进度条
1.背景 在python运行一些,计算复杂度比较高的函数时,服务器端单核CPU的情况比较耗时,因此需要多CPU使用多进程加快速度 2.函数要求 笔者使用的是:pathos.multiproces ...
- java.lang.AbstractMethodError: org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable
[转]https://stackoverflow.com/questions/53539930/java-lang-abstractmethoderror-org-powermock-api-mock ...
- 读入 并查集 gcd/exgcd 高精度 快速幂
ios_base::sync_with_stdio(); cin.tie(); ], nxt[MAXM << ], Head[MAXN], ed = ; inline void added ...
- SHELL编程基础01
首先shell是在linux下运行的一种环境,它是以shell脚本来运行的,学会了它基本可以解决任何问题,也可以用shell脚本开发. 和java,python的相比,其弱类型的语言没有那么复杂的结构 ...
- TODO: Android UI测试 UIAutomator
前几天跑了一下UIAutomator的demo,忘记写下来了...真的日,有点忘了都. 待填坑
- jquerymobile tap事件被触发两次
首先介绍一下这个问题出现的背景:我在写网站时想要一套代码兼容手机端和pc端,所以用了jquery和jquery mobile,点击事件用的jquerymobile tap事件,但是在移动端测试时出现点 ...
- 并发编程大师系列之:CountDownLatch和Join
业务场景描述:假设一条流水线上有三个工作者:worker1,worker2,worker3.有一个任务的完成需要他们三者协作完成,worker3可以开始这个任务的前提是worker1和worker2完 ...
- Selenium常用API的使用java语言之9-模拟键盘操作
Keys()类提供了键盘上几乎所有按键的方法. 前面了解到, sendKeys()方法可以用来模拟键盘输入, 除此之 外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A. Ct ...