设计自用的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日志不打印到控制台, ...
随机推荐
- nginx日志文件的配置
文章来源 运维公会: nginx日志文件的配置 1.日志介绍 nginx有两种日志,一种是访问日志,一种是错误日志. 访问日志中记录的是客户端对服务器的所有请求. 错误日志中记录的是在访问过程中,因为 ...
- 关于QPS、TPS、PV、UV、GMV、IP、RPS的名词解释!
名词解释链接:https://blog.csdn.net/jackyrongvip/article/details/98839519
- springboot 打包发布(war包)
版本关系: 软件名称 版本号 软件名称 版本号 spring boot 2.x jdk 1.8 tomcat 9.x springboot中的pom.xml文件 打包:右键点击项目,选择如下图: 填写 ...
- [#Linux] CentOS 7 安装微信详细过程
微信安装 微信安装过程如下: 1,下载最新版本tar.gz压缩包 wget https://github.com/geeeeeeeeek/electronic-wechat/releases/down ...
- 缓存数据库memcache、redis原理对比
一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里 ...
- 使用Atmel Studio编程Arduino Uno开发板
使用Atmel Studio 7编程Arduino Uno开发板非常简单.Arduino Uno开发板是使用AVR微控制器的嵌入式应用开发的著名平台之一. 大多数人通常会使用Arduino自己的软件工 ...
- YUSS Round 1
YUSS Round 1 A. 国庆快乐 签到题. #include<bits/stdc++.h> using namespace std; int main() { printf(&qu ...
- vue 2.0 watch 监听对象的变化
- 39、扩展原理-BeanFactoryPostProcessor
39.扩展原理-BeanFactoryPostProcessor BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 BeanFactoryPostPro ...
- vim基本配置
#set nocompatible # 打开语法高亮 syntax on # 在底部显示当前模式 set showmode # 命令模式下显示键入的指令 set showcmd # 支持使用鼠标 se ...