日志轮转:如何为日志文件名添加时间戳?
为Zap日志添加时间戳
原始日志轮转代码
package main import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" lumberjack "gopkg.in/natefinch/lumberjack.v2" ) func main() { logPath, _ := os.Getwd() log := NewLoggerFp(logPath, 1, 2, 2) log.Infof("sjkshfjsdf\n") log.Infof("sjkshfjsdf\n") log.Infof("sjkshfjsdf\n") } func NewLoggerFp(logPath string, maxSize, maxBackUp, maxAge int) *zap.SugaredLogger { w := zapcore.AddSync(&lumberjack.Logger{ Filename: logPath + "/dump.log", MaxSize: maxSize, // megabytes MaxBackups: maxBackUp, MaxAge: maxAge, // days }) core := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), w, zap.InfoLevel, ) return zap.New(core).Sugar() }
问题
目前日志已正常生成,请问如何为日志文件dump.log添加时间戳?
解决方案
要给日志条目添加时间戳,只需自定义Zap的EncoderConfig,配置时间字段的键名和编码格式即可。修改NewLoggerFp函数中的编码器配置部分:
func NewLoggerFp(logPath string, maxSize, maxBackUp, maxAge int) *zap.SugaredLogger { w := zapcore.AddSync(&lumberjack.Logger{ Filename: logPath + "/dump.log", MaxSize: maxSize, // megabytes MaxBackups: maxBackUp, MaxAge: maxAge, // days }) // 自定义编码器配置,添加时间戳 encoderConfig := zap.NewProductionEncoderConfig() // 设置时间字段的键名,可自定义为易读的名称 encoderConfig.TimeKey = "timestamp" // 使用ISO8601标准时间格式 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 可选:自定义时间格式,比如"2006-01-02 15:04:05" // encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { // enc.AppendString(t.Format("2006-01-02 15:04:05")) // } core := zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), w, zap.InfoLevel, ) return zap.New(core).Sugar() }
说明
TimeKey:指定日志中时间戳对应的字段名,默认Production配置为ts,这里改为更直观的timestamp。EncodeTime:定义时间编码格式,zapcore.ISO8601TimeEncoder生成2024-05-20T14:30:00Z格式;如需自定义格式,通过匿名函数调用time.Time.Format实现即可。
修改后生成的日志条目示例:
{"timestamp":"2024-05-20T14:30:00Z","level":"info","msg":"sjkshfjsdf"}
内容的提问来源于stack exchange,提问作者overexchange
相关产品推荐
相关产品推荐

