3 回答
TA贡献1831条经验 获得超9个赞
你可以logger仅仅为了它的副作用而导入你的包,并且仍然直接使用 logrus 包:
package main
import (
log "github.com/Sirupsen/logrus"
_ "logger"
)
func main() {
log.Print()
log.Debug()
}
如果您确实希望能够通过“logger”包直接调用这些日志函数,则需要定义这些函数并将它们在内部委托给“logrus”包。
TA贡献1874条经验 获得超12个赞
将来有机会快速将 logrus 更改为其他支持相同方法的记录器
你永远不会切换到其他任何东西,因为每个记录器都有不同的方法集。例如 log15 没有Print
方法,但是Info
. 以及完全不同的记录字段(键值对)的方法。您担心更改单个导入行,但实际上您需要更改使用记录器的每一行。
如果您希望能够轻松地在日志包之间切换,您需要想出自己的日志接口(或使用最适合您的接口)并在幕后使用您选择的日志包。只有这种方法才能使您能够最大限度地减少所有代码的更改。
您还可以在您的库中提供一个接口,然后提供一个使用特定实现的默认记录器。请注意,我知道的所有记录器包都提供了某种记录器结构(例如logrus.Logger),您可以将其附加到您的界面。然后,您可以log = logger.New()
在整个应用程序中使用,而不是在导入时更改包名称。
如果您不接受这些论点并想走自己的路,从我的角度来看,您只需要一个alias。您可以 fork 一个日志库并在您的代码中使用自己的 fork(这将允许您在不影响导入器的情况下完全更改行为)或简单地将您想要的导入路径符号链接到 logrus(尽管这不适用于go get
) .
TA贡献1799条经验 获得超6个赞
我认为你需要的是一个界面。这是一个非常简单的例子。
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 函数的代码。
- 3 回答
- 0 关注
- 163 浏览
添加回答
举报