Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何在golang中实现基于级别的日志记录?_Logging_Go - Fatal编程技术网

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

Logging 如何在golang中实现基于级别的日志记录?,logging,go,Logging,Go,在golang中是否有用于基于级别的日志记录的好包装器? 如果没有,我应该如何着手实施一个呢 我想要的很简单。我想要一些功能,例如 log.Error() log.Info() etc,将其输出显示到stdout,并将其保存在日志文件中(基于作为命令行参数提供给程序的级别)。 如何实现此包装器?请查看并查看“applog”包。它是这样工作的 PS:整个CGL目前正在重新设计,不久将推出新功能,但名称不同。;) 我认为这很适合你,而且它似乎很受欢迎,因为它经常出现在日志讨论中。我从未认真使用过它

在golang中是否有用于基于级别的日志记录的好包装器? 如果没有,我应该如何着手实施一个呢

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

log.Error()
log.Info()
etc,将其输出显示到stdout,并将其保存在日志文件中(基于作为命令行参数提供给程序的级别)。 如何实现此包装器?

请查看并查看“applog”包。它是这样工作的

PS:整个CGL目前正在重新设计,不久将推出新功能,但名称不同。;)

我认为这很适合你,而且它似乎很受欢迎,因为它经常出现在日志讨论中。我从未认真使用过它,因此除此之外我无法发表评论。

完全符合您的要求:

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

鉴于现有答案已经过时,还有一些建议:

  • -这里比另一个小
  • -用于许多流行项目,如Docker
  • -谷歌,在GO
  • 中实现C++ GOLG库
  • 重点关注“结构化日志记录”,它更适合工具使用
  • -“燃烧得很快”
      • :快速、结构化、分级登录Go
      • :结构化、可插拔的Go日志记录。(JSON和文本格式)
      这两个库都有levelhook,这是一个非常有趣的特性。可以为特定日志级别注册挂钩。因此,例如,发生任何错误(使用
      log.error()
      )时,您可以向某些监视工具等报告。

      我发现这非常容易使用,您甚至不需要更改std库对
      log.Printf
      的方法调用

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

      让我信服的是:

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

      我已将日志级别支持添加到内置的Go日志包中。您可以在此处找到我的代码:


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

      您可以使用模块midlog实现任何其他日志库,
      这是一篇不错的文章,基本上就是这么说的。我觉得这可能太固执己见,但是阅读不同的观点也是值得的。

      < P>你可以考虑的一个日志模块是KLoG。它支持“V”日志记录,这为在特定级别进行日志记录提供了灵活性

      klog是glog的一个分支,它克服了以下缺点

      glog提出了很多“陷阱”,并在集装箱化环境中引入了挑战,所有这些都没有很好的文档记录。 glog没有提供一种简单的方法来测试日志,这会降低使用它的软件的稳定性 GOLG是C++的基础,KLogo是纯Gangon实现< /P> 示例实现

      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()
      }
      

      @elithrar,谢谢,它很简单而且功能强大,可能比你需要的要多,但值得一看。该实现非常有趣地使用了布尔类型和方法。似乎seelog必须为每个语句获取/释放全局锁。不幸的是,链接已失效所有链接均已失效或与日志无关。很抱歉,随着时间的推移,出现了所有移动。需要一些时间才能找到目前最好的一个。软件包位于,文档位于。此外,二进制日志和nanolog不符合“将其输出显示到标准输出”的要求。Binlog没有GitHub星星。欢迎链接到解决方案,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及为什么存在,然后引用您链接到的页面的最相关部分,以防目标页面不可用。logrus的一个缺点是它没有日志旋转,需要使用一些外部程序来实现这一点。。。