添加自动文件压缩的实现

This commit is contained in:
yun
2026-09-13 21:53:37 +08:00
parent ab11fa71a0
commit 316c6420a7
21 changed files with 2037 additions and 66 deletions
+38 -2
View File
@@ -1,6 +1,7 @@
package loggerx
import (
"compress/gzip"
"io"
"os"
"time"
@@ -19,7 +20,10 @@ type loggerOption struct {
days int // 日志保存天数
drivers []io.Writer // 文件落盘驱动器
fileSplit FileSplit // 文件切割规则
sizeSplit int // 根据文件大小切割
sizeSplit int // 根据文件大小切割(字节,<=0 不切割)
compress bool // 归档文件是否压缩为 .gz
compressLvl int // gzip 压缩级别
flushEvery time.Duration // 定时刷盘间隔,0 表示不开启
timeZone *time.Location // 时区
escapeHTML bool
expandData map[string]string // 扩展字段
@@ -45,6 +49,8 @@ func defaultOptions() loggerOption {
traceField: "trace_id",
days: 7,
fileSplit: FileSplitTimeE,
compress: true,
compressLvl: gzip.BestSpeed,
timeZone: time.Local,
escapeHTML: true,
expandData: make(map[string]string),
@@ -186,13 +192,43 @@ const (
)
// 根据文件大小切割(暂时未生效)
// 根据文件大小切割
// m 为单个文件的大小上限(字节);<=0 表示不按大小切割
// 超过上限时当前文件会被改名归档(并可选压缩),随后写入新文件
func SetSizeSplit(m int) Option {
return func(o *loggerOption) {
o.sizeSplit = m
}
}
// 归档文件是否压缩成 .gz(默认开启)
// 压缩在后台协程完成,不阻塞写入
func SetCompress(open bool) Option {
return func(o *loggerOption) {
o.compress = open
}
}
// 压缩级别 1~9,数字越大压缩率越高、CPU 开销越大,默认 gzip.BestSpeed
func SetCompressLevel(level int) Option {
return func(o *loggerOption) {
if level >= gzip.HuffmanOnly && level <= gzip.BestCompression {
o.compressLvl = level
}
}
}
// 定时刷盘间隔(默认 0 = 不开启)
// 开启后会按间隔把内存缓冲刷到磁盘,把「进程崩溃时可能丢失的数据量」
// 从「最多 32KB 缓冲」压缩到「一个间隔内产生的日志量」
func SetFlushInterval(d time.Duration) Option {
return func(o *loggerOption) {
if d > 0 {
o.flushEvery = d
}
}
}
func SetEscapeHTML(b bool) Option {
return func(o *loggerOption) {
o.escapeHTML = b