在GO中滚动日志文件的最佳方法

时间:2016-03-21 18:37:56

标签: logging go

在生产中使用go语言的人是否面临滚动日志文件的问题?

是否有可能安全地滚动日志文件线程?

是否有任何框架可以做到这一点?

谢谢。

4 个答案:

答案 0 :(得分:4)

我倾向于采用12 Factor方法记录到std错误并让其他东西处理旋转。

然后,您可以让系统为您旋转日志,如上所述here

答案 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函数调用之前,以防止在日志文件旋转后写日志的可能性