nxlog4go的項目網址:html
https://github.com/ccpaging/nxlog4gogit
項目歷史
ccpaging's log4go forked from https://github.com/alecthomas/log4go程序員
The latest release is 4.0.3 詳見:https://github.com/ccpaging/log4go/releasesgithub
修復了一些bug。在修改的過程當中產生了很多想法。詳見:http://www.cnblogs.com/ccpaging/p/7205226.html數據庫
實現這些想法要修改log4go的基本框架,所以,項目改名爲 nxlog4gojson
nxlog4go 簡介
nxlog4go 融合了log4net 與 go log的基本框架。服務器
Logger 是日誌記錄容器。包含了若干 Filter。另外,nxlog4go的Logger兼容了go log的io.Writer,一樣支持io,MultiWriter。網絡
Filter 基於level過濾日誌。每一個 Filter 包含一個 Appender。app
Appender 輸出日誌。例如,輸出到彩色終端、滾動文件、TCP/IP網絡日誌服務器等。框架
Layout 格式化日誌。
詳細瞭解log4net的結構請參考:
Logger
Logger 的結構以下:
type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write at beginning of each line caller bool // runtime caller skip out io.Writer // destination for output level Level // The log level layout Layout // format record for output filters *Filters // a collection of Filters }
分紅幾個部分:
-
鎖。協調寫日誌和改變配置。若是能保證在寫日誌前配置,鎖不是必須的。
-
前綴和取源程序文件名行號的開關。因爲後者消耗了大量的cpu,可能不適合生產環境,所以,設置了開關能夠關閉。前綴能夠在多模塊的系統中用於區分不一樣的模塊。也許在網絡蒐集日誌的模型中可用於過濾和分發。
-
go log兼容的 io.Writer 以及附加的level過濾和layout格式化。nxlog4go 的 logger 直接使用而無需添加任何的 Appender。方便程序員在開發環境下使用。
-
filter容器的指針。使用指針能夠容易的設置和重置。
新建 Logger 有三種方式:
-
使用 nxlog4go 內建的 logger。
-
在main.go中新建全局變量。
-
在多模塊系統中,設置單獨的模塊新建全局變量供其它模塊調用。
若是在package開發中使用,建議增長函數:
func GetLogger() *Logger { return ... }
返回 Logger 的變量指針,方便使用package的程序對 Logger 進行設置。
Filter
Filter 的結構以下:
type Filter struct { Level Level Appender rec chan *LogRecord // write queue closing bool // true if filter was closed at API level }
nxlog4go 提供了標準的 go routine 框架,最大程度的方便程序員開發新的 Appender。
Appender
Appender 的結構以下:
type Appender interface { // Set option about the Appender. The options should be set as default. // Must be set before the first log message is written if changed. // You should test more if have to change options while running. SetOption(name string, v interface{}) error // This will be called to log a LogRecord message. Write(rec *LogRecord) // This should clean up anything lingering about the Appender, as it is called before // the Appender is removed. Write should not be called after Close. Close() }
Appender 是一個接口定義。有如下特色:
-
可擴展性。Filter 自動調用 Write,程序員能夠編寫本身的 Write,例如將日子存入map file、存入數據庫等等。
-
nxlog4go 提供了一些基礎的Appender,例如:
- color 目錄下的彩色屏幕日誌輸出
- file 目錄下可用於生產環境的定時滾動日誌文件輸出
- socket 目錄下支持TCP/UDP Client的網絡日誌輸出
這些 Appender 能夠做爲開發新輸出接口的參考。
Layout
Layout 的結構以下:
type Layout interface { // Set option about the Layout. The options should be set as default. // Must be set before the first log message is written if changed. // You should test more if have to change options while running. Set(name string, v interface{}) Layout Get(name string) string // This will be called to log a LogRecord message. Format(rec *LogRecord) []byte }
在早期的 log4go 中只提供了一個函數接口,基於字符串處理。在nxlog4go中使用[]byte,避免反覆轉換形成的效率下降。
對效率提升影響最大的則是借用了 go log 的 itoa 函數。
// Cheap integer to fixed-width decimal ASCII. Give a negative width to avoid zero-padding. func itoa(buf *[]byte, i int, wid int) { // Assemble decimal in reverse order. var b [20]byte bp := len(b) - 1 for i >= 10 || wid > 1 { wid-- q := i / 10 b[bp] = byte('0' + i - q*10) bp-- i = q } // i < 10 b[bp] = byte('0' + i) *buf = append(*buf, b[bp:]...) }
加上 log4net 的 timeCacheType,爲 nxlog4go 提供了高效率低cpu消耗的 PatternLayout。
同時還提供了擴展 Layout 可能性。例如參照https://github.com/nblib/log4go/作的jsonLayout,據稱比json編碼的效率高一倍。
配置
log4net,做爲一個.net程序用的是xml配置文件驅動的。go lang裏邊若是這樣作,如log4go那樣,Appender的擴展性將受到限制。
go lang 中的日誌系統如此之多,彷佛沒有程序員滿意其餘人作的日誌。擴展性比配置驅動更加劇要。
nxlog4go 提供了使用 xml、json 配置文件的示例程序。詳見 example 目錄。
未來也許還會寫 nxlog4go 的使用。敬請關注……
目前 nxlog4go 還正在開發中,有些細節可能還會調整。歡迎你們 Fork and Star,提供Issues and Pull Request。