74

golang 中基于级别的日志记录有什么好的包装器吗?如果没有,我应该如何自己实施?

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

log.Error()
log.Info()

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

4

10 回答 10

65

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

于 2015-06-26T15:17:01.493 回答
6
  • Uber-go/Zap:快速、结构化、分级登录 Go
  • Logrus:用于 Go 的结构化、可插入日志记录。(JSON 和文本格式)

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

于 2016-11-07T14:03:30.493 回答
4

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

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

于 2013-06-03T11:48:25.370 回答
4

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

于 2013-06-03T12:41:07.993 回答
4

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

于 2017-03-02T09:28:37.727 回答
2

stdlog完全符合您的要求:

log := stdlog.GetFromFlags()
log.Info("Connecting to the server...")
log.Errorf("Connection failed: %q", err)
于 2014-04-19T16:08:22.240 回答
1

我目前正在使用rlog,并且喜欢他们的方法。该代码看起来不错,简单且有足够的文档记录。

是什么说服了我:

  • 没有外部依赖
  • 我可以rlog.Info()在任何地方使用而无需传递参考
  • 环境变量的良好使用
  • 任意数量的跟踪级别,例如rlog.Trace(4, "foo")
于 2017-09-15T09:36:31.207 回答
1

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

https://github.com/gologme/log

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

于 2018-02-10T02:03:10.673 回答
0

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

于 2019-12-02T12:29:30.410 回答
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()
}
于 2020-04-05T06:56:15.850 回答