首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang logrus -如何进行集中配置?

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

Stack Overflow用户
提问于 2015-05-15 18:48:59
回答 2查看 18.6K关注 0票数 30

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-15 21:55:02

您不需要使用Logrus在每个文件中设置这些选项。

您可以将Logrus作为log导入

代码语言:javascript
复制
import log "github.com/Sirupsen/logrus"

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

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

代码语言:javascript
复制
var log = logrus.New()

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

或者,您可以创建自己的包装器(这就是我所做的)。我有自己的带有自己的logger变量的log包:

代码语言:javascript
复制
var logger = logrus.New()

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

代码语言:javascript
复制
func Info(args ...interface{}) {
    logger.Info(args...)
}

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

这有点乏味,但允许我添加特定于我的程序的函数:

代码语言:javascript
复制
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))
}

这样我就可以这样做了:

代码语言:javascript
复制
log.WithConn(c).Info("Connected")

(我计划将来将logrus.Entry包装到我自己的类型中,以便更好地链接它们;目前我不能调用log.WithConn(c).WithRequest(r).Error(...),因为我不能将WithRequest()添加到logrus.Entry中。)

票数 40
EN

Stack Overflow用户

发布于 2017-10-25 07:23:43

这是我为我的应用程序设计的解决方案,它允许向日志上下文中添加字段。由于上下文基础字段的复制,它确实具有很小的性能影响。

代码语言:javascript
复制
package logging

import (
    log "github.com/Sirupsen/logrus"
)

func NewContextLogger(c log.Fields) func(f log.Fields) *log.Entry {
    return func(f log.Fields) *log.Entry {
        for k, v := range c {
            f[k] = v
        }
        return log.WithFields(f)
    }
}

package main

import (
    "logging"
)

func main {
    app.Logger = logging.NewContextLogger(log.Fields{
        "module":    "app",
        "id":   event.Id,
    })
    app.Logger(log.Fields{
        "startTime": event.StartTime,
        "endTime":   event.EndTime,
        "title":     event.Name,
    }).Info("Starting process")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30257622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档