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這三個字符串,所以可以產生新的日志文件並寫入里面。而第一種呢,相當於把文件名固定死了,因此就不會做日志切割了。