从包中导入Golang方法

从包中导入Golang方法,go,Go,现在我决定在我的围棋程序中使用水平记录器。现在是洛格斯。 但经过一些调查(通过疼痛)发现有很多伐木者:glog、log15、logrus等等。所以,现在我想尝试使用logrus并拥有 可以在另一个上更改它,而无需修复使用日志的所有来源 我尝试创建自己的包记录器,它只导入logrus: package logger import "github.com/Sirupsen/logrus" func init() { logrus.SetFormater(new(logrus.TextFor

现在我决定在我的围棋程序中使用水平记录器。现在是洛格斯。 但经过一些调查(通过疼痛)发现有很多伐木者:glog、log15、logrus等等。所以,现在我想尝试使用logrus并拥有
可以在另一个上更改它,而无需修复使用日志的所有来源

我尝试创建自己的包记录器,它只导入logrus:

package logger
import "github.com/Sirupsen/logrus"

func init() {
    logrus.SetFormater(new(logrus.TextFormater))    
}
在我的所有其他来源中,a希望以以下方式使用我: //梅因,加油

package main
import log "logger"

func main() {
   log.Print(...)
   log.Debug(...)
   and so on
}
但编译器告诉我在logger包中并没有这样的方法。 是否有一种方法只需将一些包a导入到我自己的包B中,并在我的代码中使用a到B的所有方法

我之所以需要这样做,是为了将来有机会快速地将logrus更改为另一个记录器,该记录器支持相同的方法,只需替换我自己记录器文件中的几行代码,而无需替换
在所有来源的导入日志“github.com/some_bestlogger”上导入日志“github.com/Sirupsen/logrus”

您可以导入您的
记录器
软件包,只需考虑其副作用,仍然可以直接使用logrus软件包:

package main

import (
    log "github.com/Sirupsen/logrus"
    _ "logger"
)

func main() {
    log.Print()
    log.Debug()
}
如果您确实希望能够通过“logger”包直接调用这些日志函数,则需要定义函数并在内部将它们委托给“logrus”包

将来有机会快速将logrus更改为支持相同方法的其他记录器

您永远不会切换到其他任何东西,因为每个记录器都有不同的方法集。例如,log15没有
Print
方法,而是
Info
。和记录字段(键值对)的完全不同的方法。您担心更改单个导入行,但实际上您需要更改使用logger的每一行

如果您希望能够轻松地在日志记录包之间切换,则需要提供自己的日志记录接口(或使用最适合您的接口),并在后台使用您选择的日志记录包。只有这种方法才能使代码周围的更改最小化

您还可以在库中提供一个接口,然后提供一个使用特定实现的默认记录器。请注意,我知道的所有记录器软件包都提供了某种记录器结构(例如),您可以将其附加到接口上。然后,您可以在整个应用程序中使用
log=logger.New()
,而不是在导入时更改包名


如果您不接受这些参数,并且希望遵循您的路径,那么从我的角度来看,您所需要的只是一个别名。您可以分叉其中一个日志库并在代码中使用自己的分叉(这将允许您在不影响导入程序的情况下完全更改行为),或者简单地将所需的导入路径符号链接到logrus(虽然这不适用于
go get
)。

我认为您需要的是一个接口。这是一个非常简单的例子

package main

import (
    "os"

    "github.com/Sirupsen/logrus"
)

func init() {
    // Output to stdout instead of the default stderr
    // Can be any io.Writer, see below for File example
    logrus.SetOutput(os.Stdout)
}

type logInterface interface {
    Print()
}

type MyLogger struct{}

func (ml MyLogger) Print() {
    logrus.WithFields(logrus.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")
}

func main() {
    mylogger := MyLogger{}

    mylogger.Print()
}

通过这种方式,您可以用任何其他日志包替换logrus,您只需要更新Print函数,而不必更改调用Print函数的代码

似乎我需要明确定义自己的方法并调用适当的logrus方法。我认为有一种方法可以隐式地(自动方式)这样做,您可以在“logger”包中创建一个
New()
函数,以及一个“logger”接口,并从您想要使用的任何包中返回一个“logger”。我将创建自己的logger接口(Print、Printf、Error等),并可能创建自己的实现(std logger+分级部分+自定义格式化程序+可能写入syslog,如)。Logrus大而不好记录。事实上,我只需要std日志+日志级别,并保持所有这些代码小而简单)还有一些问题,我发现:许多包只使用std日志。如果我创建自己的,那么这些包将写入std日志,我的应用程序将写入我的日志。为什么std日志没有级别?这不是记录器的常见任务吗?