小编典典

正确的Golang全局日志记录方法

go

Go中应用程序登录的模式是什么?如果我有例如需要登录的5个goroutine,我应该…

  • 创建一个单曲log.Logger并传递它?
  • 传递指向该指针的指针log.Logger
  • 每个例程或函数都应创建一个记录器吗?
  • 我应该将记录器创建为全局变量吗?

阅读 988

收藏
2020-07-02

共1个答案

小编典典

  • 创建一个log.Logger并传递给他?

那是可能的。甲log.Logger可以同时从多个够程中使用。

  • 传递指向该日志的指针。

log.New返回a
*Logger,通常表明您应该将对象作为指针传递。将其作为值传递将创建该结构的副本(即Logger的副本),然后多个goroutine可能会同时写入同一io.Writer。根据作者的实现,这可能是一个严重的问题。

  • 每个例程或函数都应创建一个记录器吗?

我不会为每个函数或goroutine创建单独的记录器。Goroutine(和函数)用于执行非常轻量级的任务,这些任务不足以维护单独的记录器。为项目的每个较大组件创建一个记录器可能是一个好主意。例如,如果您的项目使用SMTP服务发送邮件,那么为邮件服务创建单独的记录器听起来是个好主意,这样您就可以分别过滤和关闭输出。

  • 我应该将记录器创建为全局变量吗?

那取决于你的包裹。在前面的邮件服务示例中,为每个服务实例都配备一个记录器可能是一个好主意,以便用户可以在使用gmail邮件服务时记录故障,而与使用本地MTA时发生的故障(例如sendmail)不同。
)。

2020-07-02