现在我决定在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”
答案 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函数的代码。