当前位置: 首页 > 面试题库 >

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

甘学潞
2023-03-14
问题内容

我在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包,带有自己的loggervar:

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。)



 类似资料:
  • 输入: null 目标是使以下语句可编译: 这里有什么用?它想让我<编码>匹配器<?super java.util.list >并告诉我通过了 。那么如何在这里传递匹配器集合呢? 有一个关于将集合与hamcrest进行比较的问题,但没有传递Matchers集合的示例,而不是元素。

  • 数据采集也即埋点,它是精细化分析的第一步。数据的准确性、可扩展性以及技术人员的高效性依次被视为数据采集的三大要点。埋点,保证了数据的准确性;事件、属性、值的结构保证了数据的可扩展性;埋点文档也保证了团队成员协同的高效性。 为了帮助诸葛io的客户能够准确、高效的采集数据,我们建议您: 一、数据分析需求梳理 数据采集切忌大而全,产品不断迭代,数据分析的需求也是随着产品不断迭代的,明确长远阶段和当前阶段

  • 集成测试是对已经进行单元测试的各个部分的一种整合测试。集成是昂贵的,并且它出现在测试中。你必须把这个考虑到你的预计和时间表里。 理想情况下,你应该这样组织一个项目,使得最后没有一个阶段是必须通过显式集成来进行的。这比在项目过程中,随着事情完成逐渐集成事情要好得多。如果这是不可避免的,请仔细评估。

  • 问题内容: 我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“ google”。 我有: 但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”? 问题答案: 关键是您使用的ElasticSearch正则表达式需要 完整的字符串匹配 : Lucene的模式总是锚定的

  • 问题内容: Maven是否需要在某个时候连接到互联网才能使用它?意味着专门获取用于编译,清洁,包装等的内部Maven插件? 问题答案: 你可以在脱机模式下运行。当然,本地存储库中不可用的任何工件都将失败。Maven并非基于分布式存储库,但是它们肯定会使事情变得更加无缝。因此,许多商店使用内部镜像,这些镜像与中央存储库逐渐同步。 另外,在开始脱机工作之前,可以使用来确保已在本地安装所有依赖项。