为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 从包中导入方法

Golang 从包中导入方法

Go
慕容708150 2021-11-29 15:46:14
现在我决定在我的 Go 程序中使用水平记录器。此时是logrus。但是经过一番调查(痛定思痛)发现loggers很多:glog、log15、logrus等。所以,现在我想尝试使用 logrus 并且有可能在另一个上更改它而不修复我使用 log 的所有源。我尝试创建自己的包记录器,它只导入 logrus:package loggerimport "github.com/Sirupsen/logrus"func init() {    logrus.SetFormater(new(logrus.TextFormater))    }在我的所有其他来源中,我想以这种方式使用 i:// main.gopackage mainimport log "logger"func main() {   log.Print(...)   log.Debug(...)   and so on}但是编译器告诉我在 logger 包中没有这样的方法。有没有办法只将一些包 A 导入我自己的包 B 并在我的代码中使用 A 到 B 的所有方法?我需要这样做的原因是将来有机会快速将 logrus 更改为其他记录器,这些记录器支持相同的方法,只需替换我自己的记录器文件中的几行代码,而无需替换导入日志上的导入日志“github.com/Sirupsen/logrus”所有来源的“github.com/some_bestlogger”
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

你可以logger仅仅为了它的副作用而导入你的包,并且仍然直接使用 logrus 包:


package main


import (

    log "github.com/Sirupsen/logrus"

    _ "logger"

)


func main() {

    log.Print()

    log.Debug()

}

如果您确实希望能够通过“logger”包直接调用这些日志函数,则需要定义这些函数并将它们在内部委托给“logrus”包。


查看完整回答
反对 回复 2021-11-29
?
HUWWW

TA贡献1874条经验 获得超12个赞

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

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

如果您希望能够轻松地在日志包之间切换,您需要想出自己的日志接口(或使用最适合您的接口)并在幕后使用您选择的日志包。只有这种方法才能使您能够最大限度地减少所有代码的更改。

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

如果您不接受这些论点并想走自己的路,从我的角度来看,您只需要一个alias。您可以 fork 一个日志库并在您的代码中使用自己的 fork(这将允许您在不影响导入器的情况下完全更改行为)或简单地将您想要的导入路径符号链接到 logrus(尽管这不适用于go get) .


查看完整回答
反对 回复 2021-11-29
?
哈士奇WWW

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 函数的代码。


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信