实现一个基于 uber-go/zap 日志功能的日志文件归档模块
- 分级归档,可按info/error分开存放日志
- 按日志文件大小归档
- 按时间间隔归
1. 分级归档
zap 本身支持日志分级,在写入文件的时候选择好输出路径
2. 按文件大小
文件大小切割借助了第三方库 lumberjack ,可以选择文件的大小来切割
(LogOptions 中存放一些配置)
func (c *LogOptions) sizeDivisionWriter(filename string) io.Writer {
hook := &lumberjack.Logger{
Filename: filename,
MaxSize: c.MaxSize,
MaxBackups: c.MaxBackups,
MaxAge: c.MaxSize,
Compress: c.Compress,
}
return hook
}
3. 按时间切割
按时间切割可是借助到了第三方的库file-rotatelogs
func (c *LogOptions) timeDivisionWriter(filename string) io.Writer {
hook, err := rotatelogs.New(
filename+c.TimeUnit.Format(),
rotatelogs.WithMaxAge(time.Duration(int64(24*time.Hour)*int64(c.MaxAge))),
rotatelogs.WithRotationTime(c.TimeUnit.RotationGap()),
)
if err != nil {
panic(err)
}
return hook
}
LogOptions的TimeUnit可以选择切割单元,例如按小时切割的日志为server.log.2019091123
4. 使用
c := logger.New()
c.SetDivision("time") // 设置归档方式,"time"时间归档 "size" 文件大小归档,文件大小等可以在配置文件配置
c.SetTimeUnit(logde.Minute) // 时间归档 可以设置切割单位
c.SetEncoding("json") // 输出格式 "json" 或者 "console"
c.SetInfoFile("./logs/server.log") // 设置info级别日志
c.SetErrorFile("./logs/server_err.log") // 设置warn级别日志
c.InitLogger()
logger.Info("info level test")
logger.Info("this is a log", logger.With("Trace", "12345677")) // 带参数
logger.Error("this is a log", logger.WithError("error", errors.New("this is a new error"))) // 带error
5. Benchmark
再写个简单的benchmark
BenchmarkLogger/logde_logger_without_fields-4 3000000 563 ns/op
BenchmarkLogger/logde_logger_with_fields-4 2000000 637 ns/op
BenchmarkLogger/logde_logger_without_fields_write_into_file-4 200000 13021 ns/op
BenchmarkLogger/logde_logger_with_fields_write_into_file-4 100000 12606 ns/op
6. 结尾
放上 GitHub 地址: https://github.com/wzyonggege/logger
写得粗略,慢慢改改。