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

Dip*_*dya 20 logging go

我在Go应用程序中使用logrus.我相信这个问题也适用于任何其他日志包(它不提供基于外部文件的配置).

logrus提供了设置各种配置的功能,例如SetOutput,SetLevel等.

像我需要从多个源文件/包中进行日志记录的任何其他应用程序一样,您似乎需要使用logrus在每个文件中设置这些选项.

有没有办法在中心位置设置这些选项,以便在整个应用程序中共享.这样,如果我必须进行日志记录级别更改,我可以在一个地方执行此操作并应用于应用程序的所有组件.

Rob*_*ier 27

您无需使用Logrus在每个文件中设置这些选项.

您可以将Logrus导入为log:

import log "github.com/Sirupsen/logrus"
Run Code Online (Sandbox Code Playgroud)

然后函数就像函数一样log.SetOutput(),修改全局记录器并应用于包含此导入的任何文件.

您可以创建包全局log变量:

var log = logrus.New()
Run Code Online (Sandbox Code Playgroud)

然后函数就像log.SetOutput()方法一样,修改你的包全局.如果您的程序中有多个软件包,这是一个尴尬的IMO,因为它们中的每一个都有不同的记录器,具有不同的设置(但这可能对某些用例很有用).我也不喜欢这种方法,因为它会混淆goimports(它会插入log你的导入列表中).

或者你可以创建自己的包装器(这就是我所做的).我有自己的log包有自己的loggervar:

var logger = logrus.New()
Run Code Online (Sandbox Code Playgroud)

然后我创建顶级函数来包装Logrus:

func Info(args ...interface{}) {
    logger.Info(args...)
}

func Debug(args ...interface{}) {
    logger.Debug(args...)
}
Run Code Online (Sandbox Code Playgroud)

这有点单调乏味,但允许我添加特定于我的程序的功能:

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))
}
Run Code Online (Sandbox Code Playgroud)

所以我可以做以下事情:

log.WithConn(c).Info("Connected")
Run Code Online (Sandbox Code Playgroud)

(我计划在将来换logrus.Entry到我自己的类型,这样我可以更好地,这些链;目前我不能说log.WithConn(c).WithRequest(r).Error(...),因为我不能添加WithRequest()logrus.Entry.)