Go:日志滚动(rolling)记录器 lumberjack 简介

news2024/11/23 22:44:24

文章目录

    • 简介
    • 简单使用
      • 1. Logger 结构体
      • 2. backup日志文件的文件名
      • 3. 获取文件句柄
      • 4. 日志文件backup
      • 5. 日志滚动后处理
      • 6. 收集旧日志文件
      • 7. 后处理
    • 小结


简介

lumberjack是一个日志滚动记录器。写入lumberjack的日志达到一定的条件后会进行存档(普通文件的形式,或压缩文件的形式),然后新建另一个同名文件(原文件存档时会重命名)继续记录。但是lumberjack本身并不包含日志的基础功能,例如日志等级、日志格式化等。理论上可以向lumberjack写入任意文本,并实现滚动记录。一般情况下,lumberjack配合其他日志库,实现日志的滚动(rolling)记录。

简单使用

将lumberjack和go语言自带的log结合起来使用,可以这么设置:

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/foo.log",
    MaxSize:    500, // megabytes
    MaxBackups: 3,
    MaxAge:     28, //days
    Compress:   true, // disabled by default
})

go语言的log模块就会将日志打印到lumberjack中,lumberjack会将收到的日志写入文件,并实现滚动记录。

查看log.SetOutput接口
在这里插入图片描述
由此得知,lumberjack必须实现io.Writer接口才能与其他日志模块相结合。事实上,lumberjack也确实实现了io.Writer接口,同时也实现了io.Closer 接口。

1. Logger 结构体

lumberjack对外暴露的方法由Logger结构提供。先来看一下Logger的内部字段:

type Logger struct {
	// 日志文件名,归档日志也会保存在对应目录下
        // 若该值为空,则日志会保存到os.TempDir()目录下,日志文件名为
        // <processname>-lumberjack.log
	Filename string `json:"filename" yaml:"filename"`

	// 日志大小到达MaxSize(MB)就开始backup,默认值是100.
	MaxSize int `json:"maxsize" yaml:"maxsize"`

	// 旧日志保存的最大天数,默认保存所有旧日志文件
	MaxAge int `json:"maxage" yaml:"maxage"`

	// 旧日志保存的最大数量,默认保存所有旧日志文件
	MaxBackups int `json:"maxbackups" yaml:"maxbackups"`

	// backup的日志是否使用本地时间戳,默认使用UTC时间
	LocalTime bool `json:"localtime" yaml:"localtime"`

	// 对backup的日志是否进行压缩,默认不压缩
	Compress bool `json:"compress" yaml:"compress"`

	size int64  // 对于当前正在写入的文件,已经写了多少字节  
	file *os.File  // 当前正在写入的文件句柄
	mu   sync.Mutex

	millCh    chan bool
	startMill sync.Once
}

从上面的字面量注释可以看到,lumberjack.Logger支持json格式和yaml格式的配置文件,可以配置如下参数:

  • Filename——日志文件名
  • MaxSize——单个日志文件大小(MB)
  • MaxAge——日志存活时长(天)
  • MaxBackups——旧日志文件的数量
  • LocalTime——是否使用本地时间,否则使用UTC时间
  • Compress——是否对旧日志文件进行压缩

这几个配置参数的功能如上面的注释缩写,一目了然,无须过多解释。Logger结构实现了以下对外方法:

  • Write(p []byte) (n int, err error) // 日志写入,可能会触发的日志归档,删除过期文件,压缩归档文件等
  • Close() error // 关闭当前日志文件
  • Rotate() error // 主动归档日志文件,而非被动触发

可以将Logger看成是io.WriterCloser 的具体实现,并且还多了一个Rotate()的主动滚动日志的方法。

2. backup日志文件的文件名

函数backupName 将原文件名转换为backup文件名,本质上的操作是在原来的文件名上附加固定格式的时间戳。若对backup文件进行压缩,无非是在此基础上增加了.gz 后缀。
在这里插入图片描述

在向文件名添加时间时,根据local变量可以指定使用本地时间还是UTC时间。但是lumberjack没有开放时间格式化的接口,时间格式由一个固定的包变量决定。
在这里插入图片描述
由于使用的是go内置的time模块完成格式化,所以这个时间格式……只能2006-xx…,据说这是go语言诞生的时间。想要更改backup的文件名,可以下载源码修改并使用。对于backup的文件名,可以举例:

原文件名:/abc/def.log
backup文件名:/abc/def-2021-01-02T19-01-31.000.log

3. 获取文件句柄

在日志系统刚启动的时候,需要获取日志文件的句柄,该句柄可能是已存在的文件的,也可能是新建的文件的句柄。openExistingOrNew 方法主要用来获取日志文件句柄:
在这里插入图片描述

4. 日志文件backup

当即将写入的字节数超过当前文件的剩余配额时,即 (当前文件已写入的字节)+(当前待写入字节)>= MaxSize 时,就出发了日志滚动(rolling).

日志滚动分为三步:

  • 关闭原日志文件
  • 重命名原日志文件,附上时间字符串
  • 向通道millCh发送一个信号,以此触发后处理(例如压缩backup文件,删除过期文件等)

在这里插入图片描述

5. 日志滚动后处理

上面提到日志滚动会发送信号,这时候出发了后处理操作。后处理操作在另一个goroutine中进行,不会影响当前的日志写入。

6. 收集旧日志文件

在日志存放的文件夹下,-

7. 后处理

收集完旧的日志文件后,根据MaxBackups, MaxAge, Compress三个参数完成后处理。根据MaxBackups, MaxAge 删除过期文件,根据Compress参数决定是否压缩哪些未压缩的旧日志文件。

小结

Lumberjack是一个滚动记录器,实现了io.WriteCloser 接口,本身并不具备日志功能(如格式化,日志等级等功能),只是一个文件记录器,但是经常被用来作为日志滚动记录的工具。Lumberjack滚动记录日志,日志文件在满足一定条件后就会backup,旧日志文件的文件名是在原日志文件名的基础上附加时间信息,并可以自主选择是否压缩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TAT (AYGRKKRRQRRR)

TAT (AYGRKKRRQRRR) 是一种细胞穿膜肽, 能够将各种性质的药物高效率地传递进入细胞&#xff0c;该传递过程不需要配体-受体特异性结合, 且无饱和现象。但 TAT 缺乏细胞选择性, 能够穿透所有细胞膜, 这一缺点极大地限制了其在全身给药的肿瘤靶向系统中的应用。 编号: 402555中文…

电脑麦克风没声音怎么办?3个方法快速解决

当你跟朋友电脑语音聊天的时候&#xff0c;一连说了好几段话&#xff0c;结果朋友发消息告诉你&#xff0c;问你怎么一直不吭声&#xff0c;你这才发现&#xff0c;原来是你自己电脑麦克风没声音。电脑麦克风没声音怎么办&#xff1f;电脑麦克风说话别人听不到怎么回事&#xf…

机器学习笔记之核方法(一)核方法思想与核函数介绍

机器学习笔记之核方法——核方法思想与核函数介绍引言回顾&#xff1a;支持向量机的对偶问题核方法思想介绍线性可分与线性不可分非线性带来高维转换对偶表示带来内积核函数核函数的定义(2022/11/23)正定核函数引言 本节将介绍核方法以及核函数。 回顾&#xff1a;支持向量机…

[附源码]java毕业设计学生宿舍管理系统设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计新生入学计算机配号系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

代码随想录63——额外题目【链表】:234回文链表、143重排链表、141环形链表

文章目录1.234回文链表1.1.题目1.2.解答1.2.1.数组模拟方法1.2.2.反转后半部分链表法2.143重排链表2.1.题目2.2.解答3.141环形链表3.1.题目3.2.解答1.234回文链表 参考&#xff1a;代码随想录&#xff0c;234回文链表&#xff1b;力扣题目链接 1.1.题目 1.2.解答 1.2.1.数组…

Qt-FFmpeg开发-视频播放(5)

Qt-FFmpeg开发-视频播放【软/硬解码 OpenGL显示YUV/NV12】 文章目录Qt-FFmpeg开发-视频播放【软/硬解码 OpenGL显示YUV/NV12】1、概述2、实现效果3、FFmpeg硬解码流程4、优化av_hwframe_transfer_data()性能低问题5、主要代码5.1 解码代码5.2 OpenGL显示RGB图像代码6、完整源…

Java面试题——进程和线程的关系

并发编程 很早以前的计算机上只能执行一个程序&#xff0c;在该程序执行时&#xff0c;下一个执行流只能等待该程序执行结束&#xff0c;我们认为这种依次执行的方式十分浪费资源且效率低下&#xff08;因为一个程序执行只会消耗计算机的部分资源&#xff0c;其他资源同一时刻…

对 Masa.Blazor.Maui.Plugin.GeTuiPushBinding 项目的引用

新建一个 MAUI Blazor 项目&#xff1a;Masa.Blazor.Maui.Plugin.GeTuiSample, 添加对 Masa.Blazor.Maui.Plugin.GeTuiPushBinding 项目的引用 1、初始化个推 SDK 个推 SDK 的初始化在 MainActivity.OnCreate () 或 MainApplication.OnCreate () 方法中都是可以的&#xff0c…

使用Docker+Jenkins+Gitee自动化部署SpringBoot项目

目录搭建基础环境1、使用Docker-Compose搭建基础环境2、搭建项目仓库环境&#xff0c;创建Dockerfile文件3、配置Jenkins3.1、初始化Jenkins3.2、安装核心插件3.3、全局工具配置3.3.1、配置Git。3.3.2、配置Maven3.3.3、配置JDK3.4、配置Git凭证3.5、构建项目3.5.1、配置源码管…

Docker教程(centos下安装及docker hello world)

Docker介绍 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何…

STC51单片机38——按键控制舵机连续运动,稳定不抖动

仿真&#xff1a; //开发板按钮K3和K4&#xff0c;舵机信号线P27 //程序为12m晶振&#xff0c;开发板为11.0592M #include"reg52.h" #define u8 unsigned char #define u16 unsigned int sbit P27P2^7;//舵机信号线 sbit K3P3^2; //正偏转 sbit K4P3^3; //反偏…

我的大二web课程设计 使用HTML做一个简单漂亮的页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Flutter中GetX系列四--BottomSheet(底部弹框)

BottomSheet介绍 BottomSheet 是底部弹出的一个组件&#xff0c;常用于单选、验证码二次校验弹窗等&#xff0c;GetX的BottomSheet底部弹出是自定义通过路由push的方法实现底部弹窗的一个效果。 BottomSheet使用 我们可以通过GetX很轻松的调用bottomSheet()&#xff0c;而且…

HTML+CSS大作业:使用html设计一个简单好看的公司官网首页 浮动布局

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

web前端期末大作业:网站设计与实现——咖啡网站HTML+CSS+JavaScript

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

PMBOK史上最大的改版,你知道到底有什么精华嘛?

1、项目管理经典的5大过程组、10大知识领域和49个过程&#xff08;第六版&#xff09;的结构彻底被改变&#xff0c;取而代之的是项目管理12大原则和8大绩效域组成的全新结构&#xff1b; 2、项目管理标准顺应趋势&#xff0c;从基于过程&#xff08;Process-based&#xff09…

AI+保险,打造让投保人“叫绝”的服务方式

近年来,信息技术在保险领域的应用越来越广泛&#xff0c;在稳步推进保险业务的线上化与智能化的同时&#xff0c;也让保险服务覆盖率有了极大的提升。然而,保险业服务在智能化转型方面仍面临着诸多挑战。 咨询热线统一接入&#xff0c;客户来电不遗漏 保险企业客户不仅体量大…

人类真的与恐龙无缘见面吗?看看雕刻和绘画怎样说

人类真的与恐龙无缘见面吗&#xff1f;看看雕刻和绘画怎样说 恐龙的形象经常出现在电影、电视和网络动画。它们庞大的身躯、凶猛的样子都让人留下深刻的印象。 但是我们今天看到的恐龙都只是出现在屏幕或书籍中&#xff0c;还有在博物馆内恐龙的模型或骨架&#xff0c;那历史上…

计算机考研,我不建议考408

这篇文章是抖音和b站上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音和b站账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。欢迎大家的留言。 b站视频链…