Logging Golang包和跨包使用变量

Logging Golang包和跨包使用变量,logging,go,packages,Logging,Go,Packages,所以我想知道这里的最佳实践是什么 我有一个带有多个子包的应用程序,有些需要访问主包中的记录器,因为我使用带有颜色和时间戳等的自定义记录器 这样注射是实现这一点的唯一方法吗?(假设处理程序位于名为command的子包中) 我遇到的问题是,测试变得很烦人,因为我必须模拟记录器进行测试。 我考虑只返回应该记录的错误并让主包处理它们,但我希望像这样异步运行一些函数 go handler.HandleMessage(msg) 所以idk如何处理来自异步函数的错误,或者如果可能的话 那么,有没有一个最佳实

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

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

这样注射是实现这一点的唯一方法吗?(假设处理程序位于名为command的子包中)

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

go handler.HandleMessage(msg)
所以idk如何处理来自异步函数的错误,或者如果可能的话


那么,有没有一个最佳实践来实现我的愿望

对此有几点想法:

  • 在我看来,注入资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使代码难以更改
  • 如果logging.Logger是一种具体类型,那么可以在nil时使其工作,这样就可以跳过测试中的初始化
  • 您完全可以处理异步调用中的错误
  • 在最后一点上,您可以使用匿名函数在调用站点添加额外的错误处理:

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

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

    对此有一些想法:

  • 在我看来,注入资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使代码难以更改
  • 如果logging.Logger是一种具体类型,那么可以在nil时使其工作,这样就可以跳过测试中的初始化
  • 您完全可以处理异步调用中的错误
  • 在最后一点上,您可以使用匿名函数在调用站点添加额外的错误处理:

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

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

    谢谢!匿名函数是个好主意。你能详细说明一下吗?我不能过零。“具体类型”是什么样子的?如果logging.Logger是一个接口,那么您需要将其实现传递给NewHandler,以便对其进行调用。另一方面,如果它是一个带有方法Log()的结构{},那么在(Log*Logger)Log(msg string)函数中,您可以检查Log==nil,如果是,则返回。这意味着一个空的记录器(例如,justcreatehandler{})仍然有效-您不需要启动它。啊,好的,这是有意义的。在我的例子中,logging.Logger是一个来自第三方库的接口,所以我必须为它编写一个包装器谢谢!匿名函数是个好主意。你能详细说明一下吗?我不能过零。“具体类型”是什么样子的?如果logging.Logger是一个接口,那么您需要将其实现传递给NewHandler,以便对其进行调用。另一方面,如果它是一个带有方法Log()的结构{},那么在(Log*Logger)Log(msg string)函数中,您可以检查Log==nil,如果是,则返回。这意味着一个空的记录器(例如,justcreatehandler{})仍然有效-您不需要启动它。啊,好的,这是有意义的。在我的例子中,logging.Logger是一个来自第三方库的接口,因此我必须围绕它编写一个包装器