golang基于日期时间自动轮转日志文件的插件库go-cronowriter的使用

Golang基于日期时间自动轮转日志文件的插件库go-cronowriter的使用

go-cronowriter是一个简单的文件写入器,它会将消息写入基于当前日期和时间构建的指定格式路径中,类似于cronolog。

安装

$ go get -u github.com/utahta/go-cronowriter

基本使用示例

import "github.com/utahta/go-cronowriter"

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d")
w.Write([]byte("test"))

// 输出文件
// /path/to/example.log.20170204

指定目录结构

w := cronowriter.MustNew("/path/to/%Y/%m/%d/example.log")
w.Write([]byte("test"))

// 输出文件
// /path/to/2017/02/04/example.log

高级选项

指定时区

w := cronowriter.MustNew("/path/to/example.log.%Z", writer.WithLocation(time.UTC))
w.Write([]byte("test"))

// 输出文件
// /path/to/example.log.UTC

使用符号链接

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d", writer.WithSymlink("/path/to/example.log"))
w.Write([]byte("test"))

// 输出文件
// /path/to/example.log.20170204
// /path/to/example.log -> /path/to/example.log.20170204

使用互斥锁

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d", writer.WithMutex())

不使用互斥锁

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d", writer.WithNopMutex())

调试模式

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d", writer.WithDebug())
w.Write([]byte("test"))

// 输出到文件、stdout和stderr
// /path/to/example.log.20170204

初始化时打开文件

w := cronowriter.MustNew("/path/to/example.log.%Y%m%d", writer.WithInit())

// 在New()方法调用时打开文件
// /path/to/example.log.20170204

与zap日志库集成示例

package main

import (
	"github.com/utahta/go-cronowriter"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func main() {
	w1 := cronowriter.MustNew("/tmp/example.log.%Y%m%d")
	w2 := cronowriter.MustNew("/tmp/internal_error.log.%Y%m%d")
	l := zap.New(
		zapcore.NewCore(
			zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
			zapcore.AddSync(w1),
			zapcore.InfoLevel,
		),
		zap.ErrorOutput(zapcore.AddSync(w2)),
	)
	l.Info("test")
}

// 输出
// /tmp/example.log.20170204
// {"level":"info","ts":1486198722.1201255,"msg":"test"}

go-cronowriter是一个简单但功能强大的日志轮转工具,可以方便地集成到现有的Golang日志系统中,特别是需要按日期分割日志文件的场景。


更多关于golang基于日期时间自动轮转日志文件的插件库go-cronowriter的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于日期时间自动轮转日志文件的插件库go-cronowriter的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-cronowriter 使用指南

go-cronowriter 是一个基于日期时间自动轮转日志文件的 Go 库,它可以根据时间规则(如每天、每小时)自动创建新的日志文件,非常适合日志记录场景。

安装

go get github.com/utahta/go-cronowriter

基本使用

1. 按天轮转日志文件

package main

import (
	"log"
	"github.com/utahta/go-cronowriter"
)

func main() {
	// 创建按天轮转的日志写入器
	// 日志文件名格式: myapp.log.2006-01-02
	w := cronowriter.MustNew(
		"myapp.log.%Y-%m-%d", // 文件名模式
		cronowriter.WithSymlink("myapp.log"), // 创建符号链接指向最新日志
		cronowriter.WithMaxAge(30*24*time.Hour), // 保留30天日志
	)

	logger := log.New(w, "[INFO] ", log.LstdFlags)
	logger.Println("This log will be written to a daily rotated file")
}

2. 按小时轮转日志文件

w := cronowriter.MustNew(
	"myapp.log.%Y-%m-%d-%H", // 文件名包含小时
	cronowriter.WithSymlink("myapp.log"),
	cronowriter.WithRotationHourly(), // 设置每小时轮转
)

高级配置选项

自定义轮转时间

w := cronowriter.MustNew(
	"myapp.log.%Y-%m-%d",
	cronowriter.WithRotationTime(15*time.Minute), // 每15分钟轮转一次
)

设置时区

loc, _ := time.LoadLocation("Asia/Shanghai")
w := cronowriter.MustNew(
	"myapp.log.%Y-%m-%d",
	cronowriter.WithLocation(loc), // 使用上海时区
)

设置最大文件大小

w := cronowriter.MustNew(
	"myapp.log.%Y-%m-%d",
	cronowriter.WithMaxSize(10*1024*1024), // 10MB
)

与标准库集成

与 log 包集成

w := cronowriter.MustNew("myapp.log.%Y-%m-%d")
log.SetOutput(w)
log.Println("This will go to rotated log file")

与 zap 日志库集成

import "go.uber.org/zap"
import "go.uber.org/zap/zapcore"

w := cronowriter.MustNew("myapp.log.%Y-%m-%d")

encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
core := zapcore.NewCore(encoder, zapcore.AddSync(w), zapcore.InfoLevel)
logger := zap.New(core)

logger.Info("This is a log message with zap")

完整示例

package main

import (
	"log"
	"time"
	
	"github.com/utahta/go-cronowriter"
)

func main() {
	// 配置日志轮转
	writer := cronowriter.MustNew(
		"logs/app_%Y-%m-%d.log", // 文件名模式
		cronowriter.WithSymlink("logs/app_current.log"), // 当前日志符号链接
		cronowriter.WithMaxAge(7*24*time.Hour),         // 保留7天
		cronowriter.WithRotationTime(24*time.Hour),     // 每天轮转
		cronowriter.WithLocation(time.UTC),              // 使用UTC时间
	)

	// 设置标准日志输出
	log.SetOutput(writer)
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	// 模拟日志输出
	for i := 0; i < 100; i++ {
		log.Printf("Processing item %d", i)
		time.Sleep(1 * time.Second)
	}
}

文件名模式说明

go-cronowriter 使用 strftime 风格的格式字符串来定义日志文件名模式:

  • %Y: 4位年份 (e.g. 2023)
  • %m: 2位月份 (01-12)
  • %d: 2位日期 (01-31)
  • %H: 2位小时 (00-23)
  • %M: 2位分钟 (00-59)
  • %S: 2位秒数 (00-59)

注意事项

  1. 确保日志目录已存在,否则会报错
  2. 轮转是基于写入时间而非文件创建时间
  3. 在多进程环境下使用时需要额外考虑文件锁问题
  4. 对于高性能场景,建议使用缓冲写入

go-cronowriter 是一个轻量级但功能强大的日志轮转库,非常适合需要按时间自动管理日志文件的 Go 应用程序。

回到顶部