如何在golang中实现基于级别的日志记录?

时间:2013-06-03 11:26:41

标签: logging go

Golang中是否有可用于基于级别的日志记录的好包装器? 如果没有,我该如何自己实施?

我想要的很简单。我想要一些功能,例如。

log.Error()
log.Info()

等将它们的输出显示到stdout并将它们保存在日志文件中(基于作为命令行参数给予程序的级别)。 我如何实现这个包装器?

11 个答案:

答案 0 :(得分:40)

现在有了更多建议,现有答案已经很久了:

答案 1 :(得分:4)

查看http://cgl.tideland.biz并点击“applog”包。它正在这样工作。

PS:整个CGL目前已经过重新设计,不久将发布新功能,但名称不同。 ;)

答案 2 :(得分:4)

我认为seelog符合您的requirements,并且它似乎非常受欢迎,因为它经常在日志讨论中弹出。我从来没有认真对待它,所以我不能发表评论。

答案 3 :(得分:4)

  • Uber-go/Zap:Go
  • 中快速,结构化,分层的日志记录
  • Logurs:Go的结构化可插入日志记录。 (JSON和文本格式)

这两个库也有级别挂钩,这是一个非常有趣的功能。可以为特定日志级别注册挂钩。因此,例如,任何错误(使用log.Error()记录)都会发生,您可以向某些监控工具报告等。

答案 4 :(得分:2)

stdlog完全符合您的要求:

log := stdlog.GetFromFlags()
log.Info("Connecting to the server...")
log.Errorf("Connection failed: %q", err)

答案 5 :(得分:1)

https://github.com/hashicorp/logutils我发现这很容易使用,甚至不需要将方法调用更改为std库的log.Printf

答案 6 :(得分:1)

我目前正在与rlog合作并喜欢他们的方法。该代码看起来很好,简单并且有足够的文档记录。

让我信服的是:

  • 没有外部依赖
  • 我可以在任何地方使用rlog.Info()而无需传递参考资料
  • 良好使用环境变量
  • 任意数量的跟踪级别,例如rlog.Trace(4, "foo")

答案 7 :(得分:1)

我已经为内置的Go日志包添加了日志级别支持。你可以在这里找到我的代码:

https://github.com/gologme/log

除了添加对Info,Warn和Debug的支持外,用户还可以定义自己的任意日志记录级别。记录级别单独启用和禁用。这意味着您可以打开调试日志而无需获取其他所有内容。

答案 8 :(得分:0)

您可以使用模块Midlog来实现任何其他日志库, https://github.com/lingdor/midlog

答案 9 :(得分:0)

这是一篇不错的文章,基本上说you don't need level based logging。我觉得这也许太过自以为是,但值得一读另一种观点。

答案 10 :(得分:0)

您可以考虑的日志记录模块之一是klog。它支持“ V”记录,从而可以灵活地记录特定级别的

klog是glog的分支,并克服了以下缺点

glog提出了很多“陷阱”,并引入了容器化环境中的挑战,所有这些都没有得到很好的记录。 glog无法提供一种简便的方法来测试日志,这降低了使用它的软件的稳定性 glog基于C ++,而klog是纯golang实现

示例实施

package main

import (
    "flag"

    "k8s.io/klog"


)

type myError struct {
    str string
}

func (e myError) Error() string {
    return e.str
}

func main() {
    klog.InitFlags(nil)
    flag.Set("v", "1")
    flag.Parse()

    klog.Info("hello", "val1", 1, "val2", map[string]int{"k": 1})
    klog.V(3).Info("nice to meet you")
    klog.Error(nil, "uh oh", "trouble", true, "reasons", []float64{0.1, 0.11, 3.14})
    klog.Error(myError{"an error occurred"}, "goodbye", "code", -1)
    klog.Flush()
}