如何创建一个包来使用任何记录器,具体取决于golang中的“调用者”程序?

时间:2016-03-21 17:54:50

标签: logging go

正如我所看到的,每个开发人员都有自己的需求和方法来解决相同的事情/需求。举个例子,记录。有许多日志包以不同的方式工作,每个开发人员选择最适合他们需求/偏好的日志包。考虑到这一点,我想创建一个应该使用调用者的日志包的包。可能吗?有人有办法做到这一点吗?

这样的事情:

使用logrus包的主要代码:

package main

import (
    "os"

    "github.com/Sirupsen/logrus"

    "gitlab.com/tutume/_testing/globallogs/mypack"
)

var Log = logrus.New()

var myPack pack.Pack

func main() {
    isDebug := os.Getenv("MYAPP_LOGLEVEL")
    switch isDebug {
    case "Debug":
        Log.Level = logrus.DebugLevel
    case "Info":
        Log.Level = logrus.InfoLevel
    default:
        Log.Level = logrus.ErrorLevel
    }
    Log.Formatter = &logrus.TextFormatter{
        ForceColors: true,
    }

    Log.Debug("Debugging...")
    Log.Info("Informing...")
    Log.Error("Normal...")

    myPack.Logger = Log
    myPack.DoSomething()

}

mypack代码:

package pack

type Pack struct {
    Logger interface{}
}

func (mp *Pack) DoSomething() {
    //  Logger.Debug("Debugging...")
    //  Logger.Info("Informing...")
    //  Logger.Error("Normal...")
}

2 个答案:

答案 0 :(得分:1)

如果我了解您要执行的操作,则需要定义日志包将实现的接口。如果将Logger定义为空接口,则无法调用任何这些方法。相反,您需要定义一个包含您要使用的方法的接口(Debug,Info,Error等)。然后,任何日志包都必须实现这些方法。如果特定的日志包没有正确的方法集,那么在定义时必须编写一些包装代码来实现接口。

答案 1 :(得分:0)

我一直在寻找this post。很有意思。 作为基础架构经理/技术人员,我使用(并且已经使用过)的许多软件总是错过的一件事是能够获得尽可能深入的信息来识别和修复问题,甚至可以记录一切用于审计/安全性提案。很多时候,我们面临一些问题,即使在调试模式下我们也无法找到问题的确切原因,我们最终只是找到了“可能”的原因。现在回到开发世界,看看开发人员如何使用日志和库,我认为这可能是一个原因(缺乏“主程序和它的库之间的互操作性)。因为库通常有”他们自己的“记录(或者根本不记录)和很多次,没有对库内发生的事情给出”完全控制“,在大多数情况下,开发主程序的开发人员(使用这样的库)将无法为自己的应用程序提供必要的日志记录详细信息。当然,我了解在开源世界中,如果您想获得更详细的信息,包括您使用的库,因为它是开源的,您可以简单地进行更改然而,这可以使用一个库(考虑到使用库主要是为了不花时间“重新创建轮子”,在其他世界可重用性中)的优势并不像应该的那样有用。 正如所引用的帖子所述,处理它的一种方法是始终向呼叫者发送要处理的“必要”信息。但通常它适用于错误,致命和信息级事件。但是对于调试和跟踪,例如,在开发库时(由于许多原因)它并不“实际”,然后我认为一个重要原因是,当开发人员开发库时,他将需要所有调试和跟踪用于测试,但不一定要发回给调用者。帖子中详细介绍的另一种方法是使用处理程序,但通过这样做,库的开发人员还有很多工作要做。正如Andy回答的那样(并且在帖子中也有讨论),另一种方法是创建一个接口,接收主程序的记录器并使用它,并且为了使该选项正常工作,它应该使用stdlib日志(或者一些日志库,如果调用者程序没有关于日志记录的情况,则实现最多的comum日志记录级别。 对于我现在的“愿望”(因为我再次编程并在Go中完全开始),我将创建一些“丑陋的代码”来处理我的需求并继续学习并尝试实现“完美的日志记录系统”。到目前为止,恕我直言,正如安迪建议的那样使用界面。