我现在在一个web服务器启动后的init内将日志写入log文件中
file, err := os.OpenFile("/data/go/test/log/info.log."+time.Now().Format("20060102"), os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
defer file.Close()
if err == nil {
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.SetPrefix("[Debug]")
log.SetOutput(file)
}
现在有一个问题,日志文件我想一天一个,但是这种写法go svr一旦启动起来,日志就一直往那个目录写。是不是应该启动一个goroutine,每天来重写log.setoutput?
或者有更好的办法吗?
你好,这是个好问题,我之前也没仔细思考过,所以回答之前做了一番研究。下面是我的回答。
我个人觉得不需要,你可以在写日志之前来判断。举个例子 lumberjack/lumberjack.go at a96e63847dc3c67d17befa69c303767e2f84e54f · natefinch/lumberjack
这里 lumberjack 写日志之前会判断当前日志文件是否达到配置的最大值,如果是就执行一次 rotation。
你的问题抽象出来应该就是 logrotate 的问题,直接使用标准库里的 log 模块还需要自己解决很多问题,比如轮转,比如压缩和旧文件的清理等,所以可以考虑使用第三方库,或者参考他们的实现。这里的第三方库有这些:
natefinch/lumberjack: lumberjack is a rolling logger for Go
NYTimes/logrotate
cihub/seelog: Seelog is a native Go logging library that provides flexible asynchronous dispatching, filtering, and formatting.
我并没有上面看完所有的源码,所以需要你自己鉴别 :)
关键词:logrotate、log roll file、log rotation
Refs:
Log rotation - Wikipedia
logrotate(8) - Linux man page