Go語言file-rotatelogs的小坑


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM