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