nxlog4go 簡介 - 基於log4go的下一代日誌系統

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的結構請參考:

  1. log4net Tutorial

  2. 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
}

分紅幾個部分:

  1. 鎖。協調寫日誌和改變配置。若是能保證在寫日誌前配置,鎖不是必須的。

  2. 前綴和取源程序文件名行號的開關。因爲後者消耗了大量的cpu,可能不適合生產環境,所以,設置了開關能夠關閉。前綴能夠在多模塊的系統中用於區分不一樣的模塊。也許在網絡蒐集日誌的模型中可用於過濾和分發。

  3. go log兼容的 io.Writer 以及附加的level過濾和layout格式化。nxlog4go 的 logger 直接使用而無需添加任何的 Appender。方便程序員在開發環境下使用。

  4. filter容器的指針。使用指針能夠容易的設置和重置。

新建 Logger 有三種方式:

  1. 使用 nxlog4go 內建的 logger。

  2. 在main.go中新建全局變量。

  3. 在多模塊系統中,設置單獨的模塊新建全局變量供其它模塊調用。

若是在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 是一個接口定義。有如下特色:

  1. 可擴展性。Filter 自動調用 Write,程序員能夠編寫本身的 Write,例如將日子存入map file、存入數據庫等等。

  2. 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。

https://github.com/ccpaging/nxlog4go

相關文章
相關標籤/搜索