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