Golang Logrus-如何进行集中配置?
我在Go应用中使用logrus。我相信这个问题也适用于任何其他日志记录程序包(不提供基于外部文件的配置)。
logrus提供用于设置各种配置的功能,例如SetOutput,SetLevel等。
像其他任何应用程序一样,我需要从多个源文件/程序包进行日志记录,似乎您需要在每个文件中使用logrus设置这些选项。
是否有任何方法可以将这些选项设置在某个中央位置,以便在整个应用程序中共享。这样,如果我必须更改日志记录级别,则可以在一个地方进行更改并将其应用于应用程序的所有组件。
回答:
您无需使用Logrus在每个文件中设置这些选项。
您可以将Logrus导入为log
:
import log "github.com/Sirupsen/logrus"
然后,像这样的函数log.SetOutput()
就是函数,它们会修改全局记录器,并应用于包含此导入的任何文件。
您可以创建一个包全局log
变量:
var log = logrus.New()
然后,像函数这样log.SetOutput()
的函数会全局修改您的包。如果您的程序中有多个软件包,这将是一个尴尬的IMO,因为它们每个都有一个具有不同设置的不同记录器(但对于某些用例来说可能会很好)。我也不喜欢这种方法,因为它很容易混淆goimports
(它会插入log
您的导入列表中)。
或者,您可以创建自己的包装器(这就是我要做的)。我有自己的log
包,带有自己的logger
var:
var logger = logrus.New()
然后,我制作顶级函数来包装Logrus:
func Info(args ...interface{}) { logger.Info(args...)
}
func Debug(args ...interface{}) {
logger.Debug(args...)
}
这有点乏味,但是允许我添加特定于程序的函数:
func WithConn(conn net.Conn) *logrus.Entry { var addr string = "unknown"
if conn != nil {
addr = conn.RemoteAddr().String()
}
return logger.WithField("addr", addr)
}
func WithRequest(req *http.Request) *logrus.Entry {
return logger.WithFields(RequestFields(req))
}
因此,我可以执行以下操作:
log.WithConn(c).Info("Connected")
(我计划将来包装logrus.Entry
到我自己的类型中,以便可以更好地链接它们;当前无法调用,log.WithConn(c).WithRequest(r).Error(...)
因为无法添加WithRequest()
到logrus.Entry
。)
以上是 Golang Logrus-如何进行集中配置? 的全部内容, 来源链接: utcz.com/qa/429899.html