Go中的应用程序日志记录的模式是什么?如果我有,说,5 goroutines我需要登录,我应该…
>创建一个log.Logger并传递它?
>传递一个指向log.Logger的指针?
>每个goroutine或函数应该创建一个记录器吗?
>我应该将记录器创建为全局变量吗?
- Create a single log.Logger and pass it around?
这是可能的。一个log.Logger可以同时使用多个goroutine。
- Pass around a pointer to that log.Logger?
log.New返回一个* Logger,这通常表明你应该作为一个指针传递对象。将它作为值传递将创建结构的副本(即,记录器的副本),然后多个goroutines可能同时写入同一个io.Writer。这可能是一个严重的问题,这取决于作者的实现。
- Should each goroutine or function create a logger?
我不会为每个函数或goroutine创建一个单独的记录器。 Goroutines(和函数)用于非常轻量级的任务,这将不能证明维护单独的记录器。这可能是一个好主意,为您的项目的每个更大的组件创建一个记录器。例如,如果您的项目使用SMTP服务发送邮件,则为邮件服务创建单独的记录器听起来是一个好主意,以便您可以分别过滤和关闭输出。
- Should I create the logger as a global variable?
这取决于你的包。在以前的邮件服务示例中,为您的服务的每个实例一个日志记录器可能是个好主意,以便用户可以使用gmail邮件服务时记录失败,而不同于使用本地MTA时发生的失败(例如sendmail )。