nxlog4go 簡介 - 基於log4go的下一代日誌系統
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 的結構請參考:
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。
<https://github.com/ccpaging/nxlog4go>
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 基於事件日誌的流程挖掘簡介 - Chaudhuri事件
- syslog簡介——系統日誌寫入APIAPI
- 基於AWS-ELK部署系統日誌告警系統
- 關於Linux作業系統日誌的介紹(轉載)Linux作業系統
- mysql日誌系統簡單使用MySql
- grafana/loki:用於日誌聚合的系統GrafanaLoki
- Beego(簡介、配置、路由、日誌)Go路由
- 日誌系統
- 分散式日誌傳輸系統Databus(一)--系統介紹分散式
- MySQL日誌引數配置簡介MySql
- 滴滴基於Clickhouse構建新一代日誌儲存系統
- 基於圖的下一代入侵檢測系統
- AIX系統日誌AI
- AIX 系統日誌AI
- unix系統的日誌(shala)
- 檢視系統的日誌
- 基於 MongoDB 的 python 日誌功能MongoDBPython
- 基於MongoDB的python日誌功能MongoDBPython
- Oracle RAC叢集、程式、日誌簡介Oracle
- nxlog4go 按天或按檔案大小分割日誌Go
- 關於Python日誌系統的幾點建議Python
- 日誌工具logback的簡介與配置
- 基於websocket的簡單廣播系統Web
- 【轉】Unix系統日誌介紹和集中採集思路
- Linux系統級日誌系統Linux
- 日誌: 分散式系統的核心分散式
- Laravel 的日誌系統 - monologLaravelMono
- 日誌審計系統
- Rsyslog日誌系統
- ELK日誌分析系統
- elk 日誌分析系統
- 日誌檔案系統
- 【ELK】日誌分析系統
- 日誌系統相關
- mysql 基於日誌的主從複製MySql
- 簡單介紹MySQL列印死鎖日誌的方法MySql
- MySQL各種日誌的簡介和設定方法MySql
- 日誌-log4j2基於AsyncAppender的非同步日誌列印APP非同步