在实际开发过程中,为了节省磁盘,日志需要按照时间或者大小维度进行切割分成多分,归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(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. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  2. Flume 测试 Kafka 案例

    Flume Kafka 测试案例,Flume 的配置. a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netc ...

  3. shell 查看目前机器listen的所有端口

    netstat -lnp 这条命令的意思是列出系统里面监听网络连接的端口号和相应的进程PID.参数说明:-t:表示列出TCP连接(也可以加上-u参数表示同时列出UDP网络连接)-l:表示列出正在网络监 ...

  4. modao账户

    chairman987@163.com 墨刀注册 p@ssw0rd OR 123456

  5. 解决Bootstrap标签页(Tab)插件切换echarts不显示问题

    1.参考连接:https://blog.csdn.net/qq_24313955/article/details/78363981 问题描述:在echarts跟bootstrap选项卡整合的时候,默认 ...

  6. AudioManager: android插上耳机仍然使用扬声器播放音频

    手机音频的输出有外放(Speaker).听筒(Telephone Receiver).有线耳机(WiredHeadset).蓝牙音箱(Bluetooth A2DP)等输出设备.在平时,电话免提.插拔耳 ...

  7. Android adb命令打印activity堆栈

    ubuntu系统: adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p' window ...

  8. (转)tomcat 安全配置文档

    原文:https://www.cnblogs.com/heaven-xi/p/9961354.html 1.配置文档中使用$CATALINA_HOME变量声明为tomcat的安装目录并明确写出了tom ...

  9. ABS函数 去掉金额字段值为负数问题

    )) from OrderDetail

  10. iostat vmstat

    iostat https://linux.die.net/man/1/iostat https://www.geeksforgeeks.org/iostat-command-in-linux-with ...