GO lang日志包的局限性

时间:2016-11-08 13:21:10

标签: logging go

我正在Go中实现logger。我正在考虑使用logrus。我想了解内置日志包的限制。

我知道如果我们想将日志写入文件或实现滚动文件日志等,我们需要手动添加此功能。我们必须选择外部日志包吗?

2 个答案:

答案 0 :(得分:2)

使用内置log软件包登录文件不是问题,您可以使用log.SetOutput()Logger.SetOutput()设置默认{{1}以外的目标io.Writer例如,文件*os.File

错过了什么,经常被剔除的是水平记录(例如os.StderrINFOWARNDEBUG等。有理由,请阅读博文Dave Cheney: Let's talk about logging

您也无法强制执行指定套餐所使用的特定log.Logger,除非这些套餐"愿意"合作(例如,他们提供ERROR功能)。

滚动日志文件也是一个缺失的功能。

另一方面,它也很容易扩展"例如,用于登录MongoDB的标准记录器,有关详细信息,请参阅Go: Create io.Writer inteface for logging to mongodb database。使用MongoDB,您还可以使用Capped collection隐式地为您提供滚动文件"功能。

答案 1 :(得分:2)

可以通过多种方式记录到文件。

12因素应用程序方式(不仅仅是12因素应用程序方式,但12个因素应用程序以这种方式做到这一点)这样做是登录到STDOUT和/或STDERR然后在其他地方管道用于部署。这也使开发变得容易。此外,如果您使用容器之类的东西来部署程序,他们会将容器的STDOUT和STDERR记录到文件中。

std lib log包有两种方法可以将输出更改为文件。

一种方法如下:

log.SetOutput(<something that implements io.Writer, probably os.File>)

log.Println("some message")

另一个是:

logger := log.New(<something that implements io.Writer, probably os.File>, <a prefix String>, <some flag, see https://golang.org/pkg/log/#pkg-constants>)

logger.Println("some message")

第二个选项也是如何通过让每个级别成为自己的记录器来实现不同的日志级别(即INFO,DEBUG,WARN,ERROR等)。

然而,logrus已经为您提供了很多这样的功能,所以如果您只是希望快速实施日志记录,这可能是您最好的选择。