猿问

Golang 从包中导入方法

现在我决定在我的 Go 程序中使用水平记录器。此时是logrus。但是经过一番调查(痛定思痛)发现loggers很多:glog、log15、logrus等。所以,现在我想尝试使用 logrus 并且有

可能在另一个上更改它而不修复我使用 log 的所有源。


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


package logger

import "github.com/Sirupsen/logrus"


func init() {

    logrus.SetFormater(new(logrus.TextFormater))    

}

在我的所有其他来源中,我想以这种方式使用 i:// main.go


package main

import 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”


慕容708150
浏览 164回答 3
3回答

天涯尽头无女友

你可以logger仅仅为了它的副作用而导入你的包,并且仍然直接使用 logrus 包:package mainimport (    log "github.com/Sirupsen/logrus"    _ "logger")func main() {    log.Print()    log.Debug()}如果您确实希望能够通过“logger”包直接调用这些日志函数,则需要定义这些函数并将它们在内部委托给“logrus”包。

HUWWW

将来有机会快速将 logrus 更改为其他支持相同方法的记录器你永远不会切换到其他任何东西,因为每个记录器都有不同的方法集。例如 log15 没有Print方法,但是Info. 以及完全不同的记录字段(键值对)的方法。您担心更改单个导入行,但实际上您需要更改使用记录器的每一行。如果您希望能够轻松地在日志包之间切换,您需要想出自己的日志接口(或使用最适合您的接口)并在幕后使用您选择的日志包。只有这种方法才能使您能够最大限度地减少所有代码的更改。您还可以在您的库中提供一个接口,然后提供一个使用特定实现的默认记录器。请注意,我知道的所有记录器包都提供了某种记录器结构(例如logrus.Logger),您可以将其附加到您的界面。然后,您可以log = logger.New()在整个应用程序中使用,而不是在导入时更改包名称。如果您不接受这些论点并想走自己的路,从我的角度来看,您只需要一个alias。您可以 fork 一个日志库并在您的代码中使用自己的 fork(这将允许您在不影响导入器的情况下完全更改行为)或简单地将您想要的导入路径符号链接到 logrus(尽管这不适用于go get) .

哈士奇WWW

我认为你需要的是一个界面。这是一个非常简单的例子。package mainimport (    "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 函数的代码。
随时随地看视频慕课网APP

相关分类

Go
我要回答