3 回答
TA贡献1851条经验 获得超3个赞
我在https://github.com/natefinch/lumberjack 上取得了很好的成功,它是轻量级的,搭载在 golang 的标准和内存高效的“日志”pkg 上。
使用非常简单,只需添加一行代码即可设置,并正常使用日志:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
})
TA贡献1804条经验 获得超2个赞
这是一个内部解决方案。您可以考虑让一个 goroutine 负责日志记录和日志轮换,并通过一个通道接收来自其他 goroutine 的日志。每当需要轮转时,goroutine 都会轮转日志,而来自其他 goroutine 的传入日志则在通道上排队。日志轮换完成后,它将使通道上的任何内容出列并继续记录。
类似的东西:
type Log struct {
log string
// other info you might want
}
// This will be your goroutine
func Logging(LogChannel chan Log) {
// assume logger creates/opens a file and prepares it for writing
logger := New(logger)
for {
// collect a log. Will also block until a log is available on the channel
log <- LogChannel
if timeToRotate() {
RotateLogFile(logger)
}
// write log
logger.Log(log)
}
}
编辑:在检查日志文件是否旋转后,先前的代码具有阻塞调用。最好把它放在timeToRotate函数调用之前,以防止在日志文件轮换后写日志的可能性
- 3 回答
- 0 关注
- 820 浏览
添加回答
举报
