Golang中是否有可用于基于级别的日志记录的好包装器? 如果没有,我该如何自己实施?
我想要的很简单。我想要一些功能,例如。
log.Error()
log.Info()
等将它们的输出显示到stdout并将它们保存在日志文件中(基于作为命令行参数给予程序的级别)。 我如何实现这个包装器?
答案 0 :(得分:40)
现在有了更多建议,现有答案已经很久了:
答案 1 :(得分:4)
查看http://cgl.tideland.biz并点击“applog”包。它正在这样工作。
PS:整个CGL目前已经过重新设计,不久将发布新功能,但名称不同。 ;)
答案 2 :(得分:4)
我认为seelog符合您的requirements,并且它似乎非常受欢迎,因为它经常在日志讨论中弹出。我从来没有认真对待它,所以我不能发表评论。
答案 3 :(得分:4)
这两个库也有级别挂钩,这是一个非常有趣的功能。可以为特定日志级别注册挂钩。因此,例如,任何错误(使用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()
}