应用程序登录Go的模式是什么?如果我有,比方说,5个Goroutine需要登录,我是不是应该.
- 创建一个单独的
log.Logger
并将其传递给其他人吗? - 传一个指向
log.Logger
的指针? - 每个Goroutine或函数都应该创建一个记录器吗?
- 我应该将记录器创建为全局变量吗?
应用程序登录Go的模式是什么?如果我有,比方说,5个Goroutine需要登录,我是不是应该.
log.Logger
并将其传递给其他人吗?log.Logger
的指针?
- 是否创建一个Log.Logger并将其传递?
这是可能的.log.Logger可以从多个goroutine中同时使用.
- 传递指向该日志(log)的指针.记录器?
log.New返回*Logger
,这通常表示您应该将对象作为指针传递.将其作为值传递将创建 struct 的副本(即记录器的副本),然后多个goroutine可能会并发写入相同的io.Writer.这可能是一个严重的问题,这取决于编写器的实现.
- 每个Goroutine或函数都应该创建一个记录器吗?
我不会 for each 函数或Goroutine创建单独的记录器.Goroutine(和函数)用于非常轻量级的任务,这不会证明维护单独的记录器是合理的.为项目中每个较大的组件创建一个记录器可能是个好主意.例如,如果您的项目使用smtp服务来发送邮件,那么为邮件服务创建一个单独的记录器听起来是个好主意,这样您就可以单独过滤并关闭输出.
- 我应该将记录器创建为全局变量吗?
那要看您的包裹了.在前面的邮件服务示例中,为服务的每个实例设置一个记录器可能是个好主意,这样用户在使用Gmail邮件服务时可以记录与使用本地MTA(例如Sendmail)时发生的故障不同的故障.