Golang 语言三方库 lumberjack 日志切割组件怎么使用?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Golang 语言三方库 lumberjack 日志切割组件怎么使用?

01

介绍

Golang 语言标准库的 log 包不支持日志切割,然而如果我们业务每天产生海量日志,日志文件就会越来越大,甚至会触发磁盘空间不足的报警,此时如果我们移动或者删除日志文件,需要先将业务停止写日志,很不方便。

而且大日志文件也不方便查询,多少有点失去日志的意义。在实际业务开发中,我们通常会按照日志文件大小或者日期进行日志切割。

常见的日志切割方式是由系统 Crontab 计划任务执行 Shell 文件进行日志切割或者由业务本身进行日志切割。

Golang 语言三方库 lumberjack 的作用就是进行日志切割,下面我们来介绍一下 lumberjack。

02

lumberjack 使用

lumberjack 提供了一个滚动记录器 logger,它是一个控制写入日志的文件的日志组件,目前最新版本是 v2.0,需要使用 gopkg.in 导入。

lumberjack 提供了一个滚动记录器 logger,它是一个控制写入日志的文件的日志组件,目前最新版本是 v2.0,需要使用 gopkg.in 导入。

安装方式:

go get -u github.com/natefinch/lumberjack

导入方式:

import "gopkg.in/natefinch/lumberjack.v2"

要将 lumberjack 与标准库的 log 包一起使用,只需在应用程序启动时将它传递到 SetOutput 函数。

示例代码:

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

lumberjack 的 Logger 结构体,是一个写入指定文件的 io.WriteCloser。Logger 在第一次写入时打开或创建日志文件。如果文件存在且小于 MaxSize 的值,lumberjack 将打开并追加到该文件。如果文件存在且其 size 的值为大于等于 MaxSize,文件通过将当前时间作为文件名的一部分进行重命名文件,然后使用原始文件名创建新的日志文件。

每当写入会导致当前日志文件超过 MaxSize 的值时,当前文件将关闭和重命名,并且使用原始名称创建的新日志文件。因此,您给 Logger 的文件名始终是当前日志文件。

备份使用给定给 Logger 的日志文件名,其中名称是没有扩展名的文件名,时间戳是日志与时间一起旋转的时间。时间格式是 2006-01-02T15-04-05.000,扩展是原始扩展。例如,如果您的 Logger.Filename 是 /var/log/foo/server.log,那么 2016 年 11 月 11 日下午 6:30 创建的备份将使用 filenam 是 /var/log/foo/server-2016-11-04T18-30-00.000.log

03

清理旧日志文件

每当创建新的日志文件时,旧日志文件可能会被删除。将保留根据编码时间戳保存的最新文件,文件数量最多等于 Maxbackups 的值,如果 Maxbackups 是 0,将删除所有文件。

无论 MaxBackups 值是什么,任何编码时间戳超过 MaxAge 值的文件都将被删除。

请注意,在时间戳中编码的时间是旋转时间,可能与上次写入该文件的时间不同。

如果 MaxBackups 和 MaxAge 都是 0,则不会删除任何旧日志文件。

04

Logger 方法

  • func (l *Logger) Close() error
  • func (l *Logger) Rotate() error
  • func (l *Logger) Write(p []byte) (n int, err error)

其中 Close 替代 io.Closer,关闭当前日志文件。

其中 Rotate 会导致记录器关闭现有日志文件并立即创建新日志文件。对于想要在正常 rotation 规则之外启动 rotation 的应用程序,这是一个 helper 函数,例如对 SIGHUP 的回应。

执行 Rotate 方法后,这将根据正常规则启动旧日志文件的清理。

示例代码:如何执行 Rotate 方法后,以响应 SIGHUP 的示例。

l := &lumberjack.Logger{}
log.SetOutput(l)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP)
go func() {
    for {
        <-c
        l.Rotate()
    }
}()

其中 Write 替代 io.Writer,如果写入会导致日志文件大于 MaxSize 的值,将关闭文件,重命名文件为包含当前时间的时间戳,并使用原始日志文件名创建新的日志文件。

如果写入长度大于 MaxSize 的值,则返回错误。

05

总结本文主要是介绍三方库 lumberjack 日志切割组件,包括安装、导入和使用方法。通常在实际项目开发中,用于替代 io.Writer





相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
52 1
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
136 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
71 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
111 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
100 4
|
17天前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
71 4
Golang语言goroutine协程篇
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
71 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
37 0
|
3月前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
42 5