golang 中基于级别的日志记录有什么好的包装器吗?如果没有,我应该如何自己实施?
我想要的很简单。我想要一些功能,例如
log.Error()
log.Info()
等将它们的输出显示到标准输出并将它们保存在日志文件中(基于作为命令行参数给予程序的级别)。我如何实现这个包装器?
一些更多的建议,现在现有的答案已经很老了:
这两个库也都有级别挂钩,这是一个非常有趣的功能。可以为特定的日志级别注册挂钩。因此,例如log.Error()
发生任何错误(使用 记录),您可以向某些监控工具等报告。
看看http://cgl.tideland.biz和包“applog”。它就是这样工作的。
PS:整个 CGL 目前正在重做,很快就会发布新功能,但名称不同。;)
https://github.com/hashicorp/logutils 我发现这很容易使用,您甚至不需要更改log.Printf
std 库的方法调用。
stdlog完全符合您的要求:
log := stdlog.GetFromFlags()
log.Info("Connecting to the server...")
log.Errorf("Connection failed: %q", err)
我目前正在使用rlog,并且喜欢他们的方法。该代码看起来不错,简单且有足够的文档记录。
是什么说服了我:
rlog.Info()
在任何地方使用而无需传递参考rlog.Trace(4, "foo")
我在内置的 Go 日志包中添加了日志级别支持。你可以在这里找到我的代码:
https://github.com/gologme/log
除了添加对 Info、Warn 和 Debug 的支持外,用户还可以定义自己的任意日志级别。日志记录级别分别启用和禁用。这意味着您可以打开调试日志而无需获取其他所有内容。
您可以使用模块 midlog 来实现任何其他日志库, https://github.com/lingdor/midlog
您可以考虑的日志记录模块之一是 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()
}