应用程序登录Go的模式是什么?如果我有,比方说,5个Goroutine需要登录,我是不是应该.

  • 创建一个单独的log.Logger并将其传递给其他人吗?
  • 传一个指向log.Logger的指针?
  • 每个Goroutine或函数都应该创建一个记录器吗?
  • 我应该将记录器创建为全局变量吗?

推荐答案

  • 是否创建一个Log.Logger并将其传递?

这是可能的.log.Logger可以从多个goroutine中同时使用.

  • 传递指向该日志(log)的指针.记录器?

log.New返回*Logger,这通常表示您应该将对象作为指针传递.将其作为值传递将创建 struct 的副本(即记录器的副本),然后多个goroutine可能会并发写入相同的io.Writer.这可能是一个严重的问题,这取决于编写器的实现.

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

我不会 for each 函数或Goroutine创建单独的记录器.Goroutine(和函数)用于非常轻量级的任务,这不会证明维护单独的记录器是合理的.为项目中每个较大的组件创建一个记录器可能是个好主意.例如,如果您的项目使用smtp服务来发送邮件,那么为邮件服务创建一个单独的记录器听起来是个好主意,这样您就可以单独过滤并关闭输出.

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

那要看您的包裹了.在前面的邮件服务示例中,为服务的每个实例设置一个记录器可能是个好主意,这样用户在使用Gmail邮件服务时可以记录与使用本地MTA(例如Sendmail)时发生的故障不同的故障.

Go相关问答推荐

你能帮我优化一个golang代码关于函数CrossPointTwoRect

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

一次打印用户输入的字符串n次

如何在gofiber/websocket/v2中设置状态代码和原因

当我有外键时,如何使用 GORM 创建数据库的新条目

Go Template 动态获取变量

Golang text/template中的startswith函数 - 入门教程

Golang校验器包:重命名字段错误处理

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

Go struct 匿名字段是公开的还是私有的?

使用 LINQ 对内部数组进行排序

将文本文件放入切片然后进行比较

有没有办法计算枚举中定义的项目总数?

如果值为 false,gRPC 不返回布尔值

如何使用 Go 代理状态为 OK 的预检请求?

转到文本/模板模板:如何根据模板本身的值数组判断值?

gorm 获取列名

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

在 VSCode 中使用命令行参数调试 Go 测试