logging - Golang 包和跨包使用变量

标签 logging go package

所以我有点想知道这里的最佳实践是什么。

我有一个包含多个子包的应用程序,有些需要访问主包中的记录器,因为我使用带有颜色和时间戳等的自定义记录器。

是通过像这样注入(inject)它来实现这一目标的唯一方法吗? (假设Handler在一个名为command的子包中)

type Handler struct {
    logger logging.Logger
}

func NewHandler(logger logging.Logger) Handler {
    return Handler{
         logger: logger,
    }
} 

handler := command.NewHandler(logger)

我遇到的这个问题是测试变得很烦人,因为我必须模拟记录器进行测试。 我想过只返回应该记录的错误并让主包处理它们,但我想像这样运行一些异步函数

go handler.HandleMessage(msg)

所以我不知道如何处理来自异步函数的错误,或者如果可能的话。

那么有没有最佳实践来做我想做的事?

最佳答案

对此的几点思考:

  1. 在我看来,注入(inject)资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使您的代码难以更改。
  2. 如果你的 logging.Logger 是具体类型,那么你可以让它在 nil 时工作,这样你就可以跳过测试中的初始化。
  3. 您绝对可以处理异步调用中的错误。

关于最后一点,您可以使用匿名函数在调用站点添加额外的错误处理:

go func() {
        err := handler.HandleMessage(msg)
        // err handling / logging here
}()

如果您可以将错误有意义地传递给发起调用的调用站点,那么我更愿意每次都这样做。您确实需要记住,当您从 HandleMessage() 返回时,您仍在单独的 goroutine 中运行。

关于logging - Golang 包和跨包使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733707/

相关文章:

sql - 如何知道Fluent NHibernate生成的查询

Python 记录器未选择配置时间格式。

php - Symfony2 在监听器中使用记录器

go - 在Go中用变量解密字符串

json - 隐藏结构体字段并使其同步字段的访问和修改的最佳方法是什么?

javascript - Node.js 包自引用

java - 除非明确捕获,否则异常不会显示在控制台中

go - 如何使用GoLang Library获取系统模型。请引用我的图片

java - 如何在包之间共享低级实用程序类但不将其公开给公共(public) API?

package - 使用 dotnet pack 打包多个程序集