设计自用的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日志模块的更多相关文章

  1. golang 日志模块(log)

    log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...

  2. ERP设计之系统基础管理(BS)-日志模块设计(转载)

    原文地址:8.ERP设计之系统基础管理(BS)-日志模块设计作者:ShareERP 日志模块基本要素包括: 用户会话.登录.注销.模块加载/卸载.数据操作(增/删/改/审/弃/关等等).数据恢复.日志 ...

  3. step by step 之餐饮管理系统四(日志模块实现)

    三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...

  4. 使用线程执行堆栈StackTraceElement设计Android日志模块

    假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈  Java.lang包中 ...

  5. Android 利用线程运行栈StackTraceElement设计Android日志模块

    如果你想在你的Android程序中自动打印MainActivity.onCreate(line:37)这种类名.方法名(行数)的日志该如何实现呢? 1.引入Java的线程运行栈 Java.lang包中 ...

  6. 【Gin-API系列】Gin中间件之日志模块(四)

    日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...

  7. 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...

  8. ns3 Tutorial 中的日志模块(翻译)

      转载地址:http://blog.sina.com.cn/s/blog_8ecca79b0101d7fe.html     1  日志模块的使用   在运行 first.cc 脚本时,我们已经简单 ...

  9. gorm的日志模块源码解析

    gorm的日志模块源码解析 如何让gorm的日志按照我的格式进行输出 这个问题是<如何为gorm日志加traceId>之后,一个群里的朋友问我的.如何让gorm的sql日志不打印到控制台, ...

随机推荐

  1. MongoDB官方推荐的GUI工具-Compass的使用

    探索和操作MongoDB数据的最简单方法 用于MongoDB的GUI.可视化地查看数据.以秒为单位运行临时查询.使用完整的CRUD功能与数据交互.查看和优化查询性能.可在Linux.Mac或Windo ...

  2. Dockerfile的编写(主观汇聚篇)

    目录 一.什么是dockerfile 二.Dockerfile的基本结构 Dockerfile文件说明 三.总结 一.什么是dockerfile dockerfile是使用者用来自定义构建一个dock ...

  3. Apache常见interview

    Apache在Linux系统下的工作模式及特点?如何使Apache使用worker模式? prefork 是一种非线程.与派生的工作模式,用的是进程去处理请求,所以比较容易消耗内存,但是稳定性好,某个 ...

  4. 2-3 查找树及其Java实现

    2-3 查找树 定义(来源:wiki) 查找 插入 2-3 查找树 定义(来源:wiki) 2–3树是一种树型数据结构,内部节点(存在子节点的节点)要么有2个孩子和1个数据元素,要么有3个孩子和2个数 ...

  5. 运维开发笔记整理-QueryDict对象

    运维开发笔记整理-QueryDict对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 客户端发送数据请求有很多种,相信运维人员已经很清楚了,如果不太清楚的话可以参考我之前的学习笔 ...

  6. kvm虚拟化环境的搭建

    首先搭建kvm的虚拟化环境,我选择的环境是在vmvare上的Centos 7的虚拟机,在该环境上搭建kvm的虚拟化环境 1:安装虚拟机(该过程自行安装) 2:操作系统环境的设置 (1)修改内核模式为兼 ...

  7. Vue 前后端分离系统中遇到跨域问题

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS I  Your application is running ...

  8. Return local beginning of day time object in Go

    Both the title and the text of the question asked for "a local [Chicago] beginning of today tim ...

  9. 移动端自适应js

    window.addEventListener('resize', setHtmlFontSize) setHtmlFontSize(); function setHtmlFontSize() { v ...

  10. machine learning(11) -- classification: advanced optimization 去求cost function最小值的方法

    其它的比gradient descent快, 在某些场合得到广泛应用的求cost function的最小值的方法 when have a large machine learning problem, ...