glog日志文件分割详解:兼顾文件大小和日期
glog日志库默认将所有日志写入单个文件,这在日志量大或需要按时间归档时不够灵活。本文探讨如何通过配置和修改glog源码,实现日志文件按大小和日期自动分割。
首先,glog的maxsize
参数控制单个日志文件最大字节数。达到此限制时,glog自动创建新文件继续写入。这解决了日志文件过大的问题。
然而,maxsize
无法实现按日期分割。为此,需要修改glog源码,具体在syncBuffer
结构体的Write
方法中添加时间间隔判断。 核心逻辑如下:
var (
MaxSize uint64 = 1024 * 1024 * 100 // 100MB
MaxTimeLag time.Duration = 24 * time.Hour // 每天分割
lastTime time.Time = time.Now()
)
func (sb *syncBuffer) Write(p []byte) (n int, err error) {
now := time.Now()
if (sb.nbytes+uint64(len(p)) >= MaxSize) || (now.Sub(lastTime) >= MaxTimeLag) {
if now.Sub(lastTime) >= MaxTimeLag {
lastTime = lastTime.Add(MaxTimeLag)
}
if err := sb.rotateFile(now); err != nil {
sb.logger.exit(err)
}
}
n, err = sb.Writer.Write(p)
sb.nbytes += uint64(n)
if err != nil {
sb.logger.exit(err)
}
return
}
这段代码比较当前时间now
和lastTime
(上次写入时间)的差值,判断是否超过MaxTimeLag
(例如一天)。超过则调用rotateFile
创建新日志文件。MaxTimeLag
控制分割粒度,例如24 * time.Hour
表示每天一个新文件。 MaxSize
则控制文件大小。
通过结合maxsize
和修改后的Write
方法,即可实现按大小和日期双重分割。 需要注意的是,修改glog源码需要重新编译glog库。 此方法确保日志文件既不会过大,又方便按日期查找和归档。