在生产中使用go语言的人是否面临滚动日志文件的问题?
是否有可能安全地滚动日志文件线程?
是否有任何框架可以做到这一点?
谢谢。
答案 0 :(得分:4)
答案 1 :(得分:4)
我已经取得了很好的成功https://github.com/natefinch/lumberjack它的轻量级和背负着golang的标准和内存效率" log" PKG。
使用非常简单,只需添加一行代码进行设置,并正常使用日志:
\lstnewenvironment{code}{\lstset{language=[90]Fortran,
basicstyle=\ttfamily,
keywordstyle=\color{blue},
commentstyle=\color{gray},
xleftmargin=1.5cm,
morecomment=[l]{!\ }% Comment only with space after !
}}{}
答案 2 :(得分:2)
我通常做的不是直接使用日志文件。你要么写一个网络记录器,比如scribe或kafka等;或者最好是你写入stdout / stderr,并让服务运行器处理写入日志文件,转发到网络记录器或旋转文件。
答案 3 :(得分: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
函数调用之前,以防止在日志文件旋转后写日志的可能性