gpt4 book ai didi

Golang logrus - 如何进行集中配置?

转载 作者:IT老高 更新时间:2023-10-28 13:03:53 25 4
gpt4 key购买 nike

我在 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 - 如何进行集中配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30257622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com