2016-11-08 50 views
3

我正在Go中實現記錄器。我正在考慮爲此使用logrus。我想了解內置日誌包的侷限性。GO lang記錄包的限制

我知道如果我們想寫日誌文件或實現滾動文件日誌等,我們需要手動添加此功能。是否有其他限制,我們必須選擇外部日誌包?

回答

2

登錄使用內置log包文件是不是一個問題,你可以使用log.SetOutput()Logger.SetOutput()設置不是默認os.Stderr以外的目的地io.Writer,例如文件*os.File

什麼是缺失,並經常渴望平穩的日誌記錄(例如INFO,WARN,DEBUG,ERROR等)。爲了推理,請閱讀博客文章Dave Cheney: Let's talk about logging

你也不能執行特定的log.Logger供指定的包使用,除非那些包願意合作(例如它們提供了一個SetLogger()函數)。

滾動日誌文件也是一個缺失的功能。

另一方面,例如,「擴展」標準記錄器以便登錄到MongoDB也很容易,詳情請參閱Go: Create io.Writer inteface for logging to mongodb database。使用MongoDB,你也可以使用一個Capped collection這將隱含給你一個「滾動文件」功能。

2

記錄到文件可以通過多種方式完成。

這樣做的12因子應用程序方式(不僅僅是12因子應用程序的方式,而是12個因素應用程序這樣做的重點)是登錄到STDOUT和/或STDERR,然後管道它在別處進行部署。這也使開發變得容易。另外,如果你使用容器來部署你的程序,他們將容器的STDOUT和STDERR記錄到一個文件中。

std lib log包有兩種方法可以將輸出更改爲文件。

的一種方法如下:

log.SetOutput(<something that implements io.Writer, probably os.File>) 

log.Println("some message") 

另一種是:

logger := log.New(<something that implements io.Writer, probably os.File>, <a prefix String>, <some flag, see https://golang.org/pkg/log/#pkg-constants>) 

logger.Println("some message") 

第二個選項是,你也可以如何實現不同的日誌水平(即INFO,DEBUG,WARN,ERROR,等等)通過讓每個級別成爲自己的記錄器。

然而,logrus爲您提供了很多這方面的知識,所以如果您只想快速實施日誌記錄,那麼這可能是您最好的選擇。