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)
注意事项
- 确保日志目录已存在,否则会报错
- 轮转是基于写入时间而非文件创建时间
- 在多进程环境下使用时需要额外考虑文件锁问题
- 对于高性能场景,建议使用缓冲写入
go-cronowriter 是一个轻量级但功能强大的日志轮转库,非常适合需要按时间自动管理日志文件的 Go 应用程序。