3 回答

TA貢獻1831條經驗 獲得超9個贊
你可以logger僅僅為了它的副作用而導入你的包,并且仍然直接使用 logrus 包:
package main
import (
log "github.com/Sirupsen/logrus"
_ "logger"
)
func main() {
log.Print()
log.Debug()
}
如果您確實希望能夠通過“logger”包直接調用這些日志函數,則需要定義這些函數并將它們在內部委托給“logrus”包。

TA貢獻1874條經驗 獲得超12個贊
將來有機會快速將 logrus 更改為其他支持相同方法的記錄器
你永遠不會切換到其他任何東西,因為每個記錄器都有不同的方法集。例如 log15 沒有Print
方法,但是Info
. 以及完全不同的記錄字段(鍵值對)的方法。您擔心更改單個導入行,但實際上您需要更改使用記錄器的每一行。
如果您希望能夠輕松地在日志包之間切換,您需要想出自己的日志接口(或使用最適合您的接口)并在幕后使用您選擇的日志包。只有這種方法才能使您能夠最大限度地減少所有代碼的更改。
您還可以在您的庫中提供一個接口,然后提供一個使用特定實現的默認記錄器。請注意,我知道的所有記錄器包都提供了某種記錄器結構(例如logrus.Logger),您可以將其附加到您的界面。然后,您可以log = logger.New()
在整個應用程序中使用,而不是在導入時更改包名稱。
如果您不接受這些論點并想走自己的路,從我的角度來看,您只需要一個alias。您可以 fork 一個日志庫并在您的代碼中使用自己的 fork(這將允許您在不影響導入器的情況下完全更改行為)或簡單地將您想要的導入路徑符號鏈接到 logrus(盡管這不適用于go get
) .

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 函數的代碼。
- 3 回答
- 0 關注
- 203 瀏覽
添加回答
舉報