来自包

时间:2015-12-10 14:21:38

标签: go

现在我决定在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/some_bestlogger”上导入日志“github.com/Sirupsen/logrus”

3 个答案:

答案 0 :(得分:2)

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

package main

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

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

如果您希望能够通过"记录器直接调用这些日志功能"包,你需要定义函数并将它们委托给" logrus"内部包。

答案 1 :(得分:1)

  

有机会在将来快速将logrus更改为另一个支持相同方法的记录器

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

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

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

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

答案 2 :(得分:0)

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

@XmlType(name = "",propOrder = {"street","house"})
@XmlRootElement(name = "DI_Add")
public static class Address {

    private String street;
    private String house;

    @XmlElement(name = "DI_Street")
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    @XmlElement(name = "DI_House")
    public String getHouse() {
        return house;
    }
    public void setHouse(String house) {
        this.house = house;
    }
}

@XmlType(name = "", propOrder = {"name","add"})
@XmlRootElement(name = "DI_Customer")
public static class Customer {

    private String name;
    private Address add;

    @XmlElement(name = "DI_Name", required = true)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlElement(name = "DI_Add", required = true)
    public Address getAdd() {
        return add;
    }
    public void setAdd(Address add) {
        this.add = add;
    }
}

通过这种方式,您可以将logrus替换为任何其他日志包,您只需要更新Print函数,而不必更改调用Print函数的代码。