Go语言有着很多的日志管理库,比如star数最多的logrus,然而logrus库并不自带日志切割功能,想要做到日志切割,就需要用到file-rotatelogs库,这里就有个小问题。
我在刚开始用的时候,代码如下
writer, _ := rotateLogs.New(
folder + "/Service_" + time.Now().Format("20060102") + "%Y%m%d.log",
//rotateLogs.WithLinkName(folder),
rotateLogs.WithMaxAge(time.Duration(60)*time.Second),
rotateLogs.WithRotationTime(time.Duration(10)*time.Second),
)
log.SetOutput(writer)
后来在运行的时候发现这段代码根本就不进行日志切割,后来在对比github的原版代码发现,他的代码里是不带time的,我根据他的代码来对自己的做了一下修改,修改后的代码如下
writer, _ := rotateLogs.New(
folder+"/Service_%Y%m%d.log",
//rotateLogs.WithLinkName(folder),
rotateLogs.WithMaxAge(time.Duration(60)*time.Second),
rotateLogs.WithRotationTime(time.Duration(10)*time.Second),
)
log.SetOutput(writer)
再次运行测试之后发现日志果然进行了切割,于是开始寻找答案,这是RotateLogs结构体的定义
type RotateLogs struct {
clock Clock
curFn string
curBaseFn string
globPattern string
generation int
linkName string
maxAge time.Duration
mutex sync.RWMutex
eventHandler Handler
outFh *os.File
pattern *strftime.Strftime
rotationTime time.Duration
rotationSize int64
rotationCount uint
forceNewFile bool
}
注意这里有个pattern,而文件名就是根据这个生成的,用修改之后的代码,相当于每次用新的时间去匹配%Y%m%d这三个字符串,所以可以产生新的日志文件并写入里面。而第一种呢,相当于把文件名固定死了,因此就不会做日志切割了。