在实际开发过程中,为了节省磁盘,日志需要按照时间或者大小维度进行切割分成多分,归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(log rotation)

那么在 logrus 中我们该如何实现这个功能呢? logrus本身并没有实现滚动日志功能,但是我们可以使用第三方滚动插件实现.

滚动日志

我们需要使用lumberjack实现logrus的滚动日志,具体实现如下:

package main

import (
log "github.com/Sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
) func main() {
logger := &lumberjack.Logger{
// 日志输出文件路径
Filename: "/var/log/myapp/foo.log",
// 日志文件最大 size, 单位是 MB
MaxSize: 500, // megabytes
// 最大过期日志保留的个数
MaxBackups: 3,
// 保留过期文件的最大时间间隔,单位是天
MaxAge: 28, //days
// 是否需要压缩滚动日志, 使用的 gzip 压缩
Compress: true, // disabled by default
}
log.SetOutput(logger) //调用 logrus 的 SetOutput()函数
}

滚动日志的各项参数如注释所示, logrussetOutput()函数的入参是io.Writer类型, lumberjack.Logger实现了该接口.下文我们将对lumberjack.Logger的部分重要结构和函数稍作解释.

lumberjack

logger 结构

type Logger struct {
// 日志文件路径
Filename string `json:"filename" yaml:"filename"`
// 最大文件 size, 默认 100MB
MaxSize int `json:"maxsize" yaml:"maxsize"`
// 保留过期文件的最大时间间隔,单位是天(24h)
MaxAge int `json:"maxage" yaml:"maxage"`
// 最大过期日志保留的个数,默认都保留
MaxBackups int `json:"maxbackups" yaml:"maxbackups"`
// 是否使用时间戳命名 backup 日志, 默认使用 UTC 格式
LocalTime bool `json:"localtime" yaml:"localtime"`
// 是否压缩过期日志
Compress bool `json:"compress" yaml:"compress"`
size int64
file *os.File
mu sync.Mutex millCh chan bool
startMill sync.Once
}

写日志操作

func (l *Logger) Write(p []byte) (n int, err error) {
l.mu.Lock()
defer l.mu.Unlock() writeLen := int64(len(p))
if writeLen > l.max() {
return 0, fmt.Errorf(
"write length %d exceeds maximum file size %d", writeLen, l.max(),
)
} if l.file == nil {
if err = l.openExistingOrNew(len(p)); err != nil {
return 0, err
}
}
// 比较文件 size,超过指定最大 size 就需要滚动一次
if l.size+writeLen > l.max() {
// rotate 其实就是重新创建了一个新文件
if err := l.rotate(); err != nil {
return 0, err
}
} n, err = l.file.Write(p)
l.size += int64(n) return n, err
}

滚动日志:

func (l *Logger) rotate() error {
// 关闭当前文件句柄
if err := l.close(); err != nil {
return err
}
// 创建并打开新文件
if err := l.openNew(); err != nil {
return err
}
// 压缩日志文件,删除过期日志文件,内部是个协程去做过期日志清理任务
l.mill()
return nil
}

关闭日志文件

func (l *Logger) Close() error {
l.mu.Lock()
defer l.mu.Unlock()
return l.close()
}

因为本人水平有限,有什么问题或者疑问欢迎在评论区指正

logrus 剖析之滚动日志的更多相关文章

  1. PHP滚动日志

    PHP滚动日志类库 PHP记录日志,我之前接触过的有按照年月分文件夹,然后按照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式--文件滚动方式记录日志,当然了 ...

  2. 深入剖析HADOOP程序日志

    深入剖析HADOOP程序日志 前提 本文来自于 博客园 逖靖寒的世界 http://gpcuster.cnblogs.com 了解log4j的使用. 正文 本文来自于 博客园 逖靖寒的世界 http: ...

  3. C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)

    C/S系统实现两数求和 任务要求: 实现配置文件 实现日志滚动 设置非阻塞套接字,EPOLL实现 检测客户端的连接,设置心跳检测 主线程 + 心跳检测线程 + EPOLL的ET模式处理事务线程 注意事 ...

  4. 在windows实现nginx滚动日志

    nginx自身并不能够切分或滚动日志,因此只能用一个bat脚本按天切割日志,并删除三天前的日志 @echo off rem nginx滚动日志 rem nginx工作目录 set workspace= ...

  5. Python selenium chrome打包exe后禁用控制台输出滚动日志

    Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...

  6. logrus 剖析之 hook

    logrus 通过实现 Hook接口扩展 hook 机制,可以根据需求将日志分发到任意的存储介质, 比如 es, mq 或者监控报警系统,及时获取异常日志.可以说极大的提高了日志系统的可扩展性. ho ...

  7. logrus 剖析之 formatter

    使用 logrus 通过 formatter 来定义输出日志的格式,具体例子如下: package main import ( log "github.com/Sirupsen/logrus ...

  8. WorldWind源码剖析系列:日志类Log

    Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...

  9. Django多进程滚动日志的问题

    使用RotatingFileHandler控制日志文件的大小 # settings.py LOGGING = { ... 'handlers': { ... 'file': { 'level': 'I ...

随机推荐

  1. 手动停止jquery ajax请求

    主要调用jquery提供的ajax abort方法,详细代码如下: <html> <head> <meta charset="UTF-8"> & ...

  2. 多项式乘法,sb题

    给定一个n,输出\((a1+x)*(a2+x)*...(an+x)\)的多项式长度. 每一个字符(包括"a"."x"."(".") ...

  3. windows sh.exe 中文乱码

    idea 需要重启 export LANG=zh_CN.utf-8 alias ls='ls --show-control-chars --color=auto'

  4. 指针的运算符&、*

    int y=0; int* yptr=&y; •互相反作用 •*&yptr -> * (&yptr) -> * (yptr的地址)-> 得到那个地址上的变量 ...

  5. Healthcare in Azure

  6. [C++] namespace命名空间和using用法

    命名空间namespace:指标识符的各种可见范围. C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因. 很 ...

  7. Tomcat启动时,控制台和IDEA控制台中文乱码解决方案

    Tomcat启动时 控制台中文乱码 cmd控制台 IDEA控制台 解决方案 cmd乱码 打开Tomcat目录下的apache-tomcat-8.5.47\conf\logging.properties ...

  8. android -------- GifImageView 之gif图片加载

    目前支持Gif播放的开源库还是有的,试了一下还是这种好用点,所以来分享下android-gif-drawable是通过JNI来渲染帧的,这种方式比使用WebView或者Movie效率要高 要求Andr ...

  9. linux升级openssl和php_openssl模块

    一.OpenSSL源码升级 2014年4月8日,XP宣布正式停止服务的日子,也是OpenSSL爆出大漏洞的日子. OpenSSL主要是负责在一些敏感的数据提交上面被广泛使用,不乏大家经常访问的一些网站 ...

  10. 用SC命令 添加或删除windows服务提示OpenSCManager 失败5

    在安装命令行中安装  windowsOpenSCManager 失败5  的错误,原因是当前用户的权限不足,需要做的是在注册表 HKEY_LOCAL_MACHINE\Software\Microsof ...