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

ccpaging發表於2018-01-28

nxlog4go 的專案網址:

<https://github.com/ccpaging/nxlog4go>

專案歷史

ccpaging's log4go forked from <https://github.com/alecthomas/log4go>

The latest release is 4.0.3 詳見:<https://github.com/ccpaging/log4go/releases>

修復了一些 bug。在修改的過程中產生了不少想法。詳見:<http://www.cnblogs.com/ccpaging/p/7205226.html>

實現這些想法要修改 log4go 的基本框架,因此,專案更名為 nxlog4go

nxlog4go 簡介

nxlog4go 融合了 log4net 與 go log 的基本框架。

Logger 是日誌記錄容器。包含了若干 Filter。另外,nxlog4go 的 Logger 相容了 go log 的 io.Writer,同樣支援 io,MultiWriter。

Filter 基於 level 過濾日誌。每個 Filter 包含一個 Appender。

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 &gt;= 10 || wid &gt; 1 {
        wid--
        q := i / 10
        b[bp] = byte('0' + i - q*10)
        bp--
        i = q
    }
    // i &lt; 10
    b[bp] = byte('0' + i)
    *buf = append(*buf, b[bp:]...)
}

加上 log4net 的 timeCacheType,為 nxlog4go 提供了高效率低 cpu 消耗的 PatternLayout。

同時還提供了擴充套件 Layout 可能性。例如參照<https://github.com/nblib/log4go/&gtjsonLayout,據稱比 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>

更多原創文章乾貨分享,請關注公眾號
  • nxlog4go 簡介 - 基於log4go的下一代日誌系統
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章