【问题标题】:How to implement level based logging in golang?如何在 golang 中实现基于级别的日志记录?
【发布时间】:2013-05-29 12:57:08
【问题描述】:

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

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

log.Error()
log.Info()

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

【问题讨论】:

标签: logging go


【解决方案1】:

一些更多建议,现在现有的答案已经很老了:

【讨论】:

【解决方案2】:
  • Uber-go/Zap: Go 中快速、结构化、分级的日志记录
  • Logrus:Go 的结构化、可插拔日志记录。 (JSON 和文本格式)

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

【讨论】:

  • logrus 的一个缺点是它没有日志轮换,需要使用一些外部程序来实现...
【解决方案3】:

查看http://cgl.tideland.biz 和“applog”包。它就是这样工作的。

PS:整个 CGL 目前正在重做,不久将发布新功能,但名称不同。 ;)

【讨论】:

  • 不幸的是链接失效了
  • 所有链接都已失效或与日志记录无关。
  • 很抱歉随着时间的推移所有的动作。需要一些时间才能找到当前的一个作为恕我直言最好的一个。软件包位于github.com/tideland/golib,文档位于godoc.org/?q=tideland%2Fgolib
【解决方案4】:

我认为seelog 适合您的requirements,它似乎很受欢迎,因为它经常出现在日志讨论中。我从来没有认真使用过它,所以我不能对此发表评论。

【讨论】:

  • 看起来seelog 必须为每个语句获取/释放一个全局锁。
【解决方案5】:

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

【讨论】:

  • “最简单的方法” +1
【解决方案6】:

stdlog 完全符合您的要求:

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

【讨论】:

    【解决方案7】:

    我目前正在与rlog 合作,并且喜欢他们的方法。代码看起来不错、简单且文档充分。

    是什么说服了我:

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

    【讨论】:

      【解决方案8】:

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

      https://github.com/gologme/log

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        【解决方案10】:

        您可以考虑的日志记录模块之一是 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()
        }
        

        【讨论】:

          猜你喜欢
          • 2011-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多