Golang从包中导入方法

问题描述 投票:2回答:3

现在我决定在Go程序中使用水平记录器。此刻它是logrus。但经过一番调查(通过痛苦)发现有很多记录器:glog,log15,logrus等。所以,现在我想尝试使用logrus并拥有 可以在不修复我使用日志的所有源的情况下在另一个上更改它。

我试图创建自己的包记录器,它只导入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更改为ahother logger,它支持相同的方法只需替换我自己的logger文件中的几行代码,而无需在导入日志中替换导入日志“github.com/Sirupsen/logrus”所有来源都有“github.com/some_bestlogger”

go
3个回答
2
投票

您可以仅为其副作用导入logger包,并仍然直接使用logrus包:

package main

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

func main() {
    log.Print()
    log.Debug()
}

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


1
投票

有机会在未来快速将logrus更改为ahother logger,支持相同的方法

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

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

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

如果你不接受这些论点并希望遵循你的道路,从我的角度来看,你所需要的只是一个别名。您可以分叉其中一个日志记录库并在代码中使用自己的fork(这将允许您完全更改行为而不影响导入程序)或简单地将您想要的导入路径符号链接到logrus(尽管这不适用于go get )。


0
投票

我认为你需要的是一个界面。这是一个非常简单的例子。

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

© www.soinside.com 2019 - 2024. All rights reserved.