golang实现简单滚动日志记录的插件库lumberjack的使用

golang实现简单滚动日志记录的插件库lumberjack的使用

Lumberjack是一个用于将日志写入滚动文件的Go包。它是日志基础设施中的一个可插拔组件,控制日志写入的文件。

安装

使用v2.0版本,导入方式如下:

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

基本使用

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

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/foo.log",  // 日志文件路径
    MaxSize:    500,  // 文件最大大小(MB)
    MaxBackups: 3,    // 保留的旧日志文件最大数量
    MaxAge:     28,   // 保留旧日志文件的最大天数
    Compress:   true, // 是否压缩旧日志文件(默认false)
})

Logger结构体

Logger是一个实现了io.WriteCloser接口的结构体,它会写入指定的文件。

type Logger struct {
    // 要写入的日志文件路径
    Filename string `json:"filename" yaml:"filename"`

    // 日志文件旋转前的最大大小(MB),默认为100MB
    MaxSize int `json:"maxsize" yaml:"maxsize"`

    // 基于文件名中时间戳保留旧日志文件的最大天数
    MaxAge int `json:"maxage" yaml:"maxage"`

    // 要保留的旧日志文件最大数量
    MaxBackups int `json:"maxbackups" yaml:"maxbackups"`

    // 是否使用本地时间而非UTC时间
    LocalTime bool `json:"localtime" yaml:"localtime"`

    // 是否压缩旧日志文件
    Compress bool `json:"compress" yaml:"compress"`
}

方法

Close()

func (l *Logger) Close() error

Close实现了io.Closer接口,关闭当前日志文件。

Rotate()

func (l *Logger) Rotate() error

Rotate使Logger关闭现有日志文件并立即创建一个新文件。这是一个辅助函数,用于在正常轮换规则之外启动轮换。

示例:在收到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()

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

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

工作原理

  • 首次写入时,会打开或创建日志文件
  • 如果文件存在且小于MaxSize,会追加到该文件
  • 如果文件存在且大小>=MaxSize,文件会被重命名(添加时间戳),并创建新的日志文件
  • 备份文件使用name-timestamp.ext格式命名
  • 当创建新日志文件时,会根据配置删除旧日志文件

清理旧日志文件

创建新日志文件时,可能会删除旧日志文件:

  • 保留最近的MaxBackups个文件(如果MaxBackups为0则保留所有)
  • 删除时间戳早于MaxAge天的文件(不考虑MaxBackups)
  • 如果MaxBackups和MaxAge都为0,则不会删除任何旧日志文件

更多关于golang实现简单滚动日志记录的插件库lumberjack的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现简单滚动日志记录的插件库lumberjack的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Lumberjack实现Golang滚动日志记录

Lumberjack是一个流行的Golang日志滚动库,它提供了自动日志文件轮转功能,可以基于文件大小、时间或两者结合来滚动日志文件。下面我将详细介绍如何使用Lumberjack。

Lumberjack基本特性

  • 按文件大小滚动日志
  • 保留最多N个旧日志文件
  • 可选择压缩旧日志文件
  • 支持日志文件清理
  • 线程安全

安装Lumberjack

go get gopkg.in/natefinch/lumberjack.v2

基本使用示例

package main

import (
	"log"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	// 配置Lumberjack日志滚动
	log.SetOutput(&lumberjack.Logger{
		Filename:   "/var/log/myapp/foo.log", // 日志文件路径
		MaxSize:    500, // 每个日志文件的最大大小(MB)
		MaxBackups: 3,   // 保留旧日志文件的最大数量
		MaxAge:     28,  // 保留旧日志文件的最大天数
		Compress:   true, // 是否压缩/归档旧日志文件
	})

	// 正常记录日志
	for i := 0; i < 10000; i++ {
		log.Println("这是一条测试日志,编号:", i)
	}
}

与标准log库集成

package main

import (
	"log"
	"os"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	// 同时输出到控制台和文件
	log.SetOutput(io.MultiWriter(os.Stdout, &lumberjack.Logger{
		Filename:   "app.log",
		MaxSize:    100,   // MB
		MaxBackups: 5,
		MaxAge:     30,    // days
	}))
	
	log.Println("这条日志会同时出现在控制台和日志文件中")
}

与logrus集成示例

package main

import (
	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	logger := logrus.New()
	
	// 配置Lumberjack
	logger.SetOutput(&lumberjack.Logger{
		Filename:   "logrus.log",
		MaxSize:    100, // MB
		MaxBackups: 5,
		MaxAge:     30,  // days
		Compress:   true,
	})
	
	logger.Info("这是一条logrus日志")
}

高级配置示例

package main

import (
	"log"
	"os"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	// 自定义日志轮转配置
	lumberjackLogger := &lumberjack.Logger{
		Filename:   "/var/log/myapp/app.log",
		MaxSize:    100,    // MB
		MaxBackups: 5,      // 保留最多5个备份
		MaxAge:     30,     // 最多保存30天
		LocalTime:  true,   // 使用本地时间
		Compress:   true,   // 压缩旧日志
	}
	
	// 设置日志输出
	log.SetOutput(lumberjackLogger)
	
	// 程序退出前关闭日志文件
	defer lumberjackLogger.Close()
	
	// 日志记录
	log.Println("应用程序启动")
	
	// 模拟日志记录
	for i := 0; i < 1000; i++ {
		log.Printf("处理请求 #%d", i)
	}
	
	log.Println("应用程序关闭")
}

动态修改日志配置

package main

import (
	"log"
	"os"
	"os/signal"
	"syscall"
	"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
	// 初始化日志配置
	logger := &lumberjack.Logger{
		Filename:   "dynamic.log",
		MaxSize:    50,
		MaxBackups: 3,
		MaxAge:     7,
	}
	log.SetOutput(logger)
	
	// 监听SIGHUP信号重新打开日志文件
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGHUP)
	
	go func() {
		for {
			<-sigs
			logger.Rotate() // 收到SIGHUP信号时轮转日志
			log.Println("收到SIGHUP信号,日志已轮转")
		}
	}()
	
	// 正常日志记录
	for i := 0; ; i++ {
		log.Printf("这是一条日志记录 #%d", i)
		time.Sleep(time.Second)
	}
}

注意事项

  1. Lumberjack不是异步的,日志写入会阻塞调用线程
  2. 在高并发场景下,建议结合缓冲写入器使用
  3. 确保应用程序对日志目录有写入权限
  4. 程序退出前最好调用Close()方法确保所有日志都写入文件

Lumberjack是一个简单而强大的日志滚动解决方案,适合大多数Golang应用的日志需求。对于更复杂的日志场景,可以考虑使用zerolog或zap等更高级的日志库,它们通常也支持与Lumberjack集成。

回到顶部