设计自用的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日志不打印到控制台, ...
随机推荐
- kubernetes 应用快速入门
使用kubectl进行增.删.查.改等常用操作 查看kubectl命令帮助 kubectl -h kubectl controls the Kubernetes cluster manager. Fi ...
- ELK文档-安装部署
一.ELK简介 请参考:http://www.cnblogs.com/aresxin/p/8035137.html 二.ElasticSearch安装部署 请参考:http://blog.51cto. ...
- Innodb学习
一.并发控制 为什么要进行并发控制? 因为并发的任务会对同一个临界资源进行操作,如果不进行并发控制,可能导致不一致,故必须进行并发控制. 如何进行并发控制? 1.锁. 2.数据多版本. 施工ing.. ...
- centos 7.0 读写ntfs分区
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum install ntfs-3g 查看 ...
- Flutter——Switch组件(开关组件)
Switch组件常用的属性: 属性 描述 value 单选的值 onChanged 改变时触发 activeColor 选中的颜色.背景颜色 import 'package:flutter/mater ...
- tomcat部署(一)
Tomcat部署最佳实践 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 tomcat是玩web软件必会技能之一,今天我给大家介绍一下tomc ...
- Linux学习之五-Linux系统终端常用的快捷键
Linux系统终端常用的快捷键 (使用快捷键能大大提高效率,部分用在远程登录的工具如Xshell下) 剪切板操作(终端不支持,因为终端是纯命令行) Ctrl+insert 复制 Shift+i ...
- js rsa sign使用笔记(加密,解密,签名,验签)
你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...
- DT6.0二次最后一次开发插件-手机端熊掌号定时提交
今天写完这个,就是DT6.0最后开放的插件,因为群里的朋友需要,就写了一个适合DT6的手机端定时插件.不过个人还是喜欢7.0的版本,7.0的插件在上几期分享了,今天就不过多说了! 我这个是初成品,改善 ...
- Lua 学习之基础篇一<Lua 运算符>
引言 由于刚接触lua,个人觉得接触一门新语言,就要一定要对基础的部分做一个快速了解. 于是参考网上相关资料吸收并整理下来作为笔记,模糊的时候用来回顾一下. 这些部分基本都是经过自己手动测试梳理过,没 ...