依赖分布式系统的公司组织和团队经常使用Go
语言编写其应用程序,以利用Go
语言诸如通道和goroutine
之类的并发功能。如果你负责研发或运维Go
应用程序,则考虑周全的日志记录策略可以帮助你了解用户行为,定位错误并监控应用程序的性能。
这篇文章将展开聊一些用于管理Go
日志的工具和技术。我们将首先考虑要使用哪种日志记录包来满足各种记录要求。然后会介绍一些使日志更易于搜索和可靠,减少日志资源占用以及使日志消息标准化的技术。
日志包的选择
Go
标准库的日志库非常简单,仅仅提供了print
,panic
和fatal
三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持. 所以催生了很多第三方的日志库,流行的日志框架包括logrus
、zap
、glog
等。我们先来大致看下这些日志库的特点再来根据实际应用情况选择合适的日志库。
log标准库
Go
的内置日志记录库(log
)带有一个默认记录器(logger
),该记录器可写入标准错误并自动向记录中添加时间戳,而无需进行配置。你可以使用它日志用于本地开发,和试验性的代码段。这时从代码中获得快速反馈可能比生成丰富结构化的日志更为重要。
logrus
logrus
是一个为结构化日志记录而设计的日志记录包,非常适合以JSON
格式记录日志。 JSON
格式使机器可以轻松解析Go
日志。而且,由于JSON
是定义明确的标准,因此通过包含新字段可以轻松地添加上下文,解析器能够自动提取它们。
使用logrus
,可以使用功能WithFields
定义要添加到JSON日志中的标准字段,如下所示。然后,可以在不同日志级别调用记录器,例如Info()
,Warn()
和Error()
。 logrus
库将自动以JSON
格式写入日志,并插入标准字段以及您即时定义的所有字段。
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
log.SetFormatter(&log.JSONFormatter{})
standardFields := log.Fields{
"hostname": "staging-1",
"appname": "foo-app",
"session": "1ce3f6v",
}
requestLogger := log.withFields(standardFields)
requestLogger.WithFields(log.Fields{
"string": "foo", "int": 1, "float": 1.1}).Info("My first ssl event from Golang")
}
生成的日志将在JSON
对象中包括消息,日志级别,时间戳、标准字段以及调用记录器即时写入的字段:
{
"appname":"foo-app","float":1.1,"hostname":"staging-1","int":1,"level":"info","msg":"My fir