nxlog4go 简介 - 基于log4go的下一代日志系统

ccpaging · · 813 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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](https://github.com/ccpaging/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](https://www.codeproject.com/Articles/140911/log-net-Tutorial) 2. [log4net教程](https://www.bbsmax.com/A/pRdBZmEedn/) ## Logger Logger 的结构如下: ```go 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 的结构如下: ```go 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 的结构如下: ```go 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、存入数据库等等。 1. nxlog4go 提供了一些基础的Appender,例如: * color 目录下的彩色屏幕日志输出 * file 目录下可用于生产环境的定时滚动日志文件输出 * socket 目录下支持TCP/UDP Client的网络日志输出 这些 Appender 可以作为开发新输出接口的参考。 ## Layout Layout 的结构如下: ```go 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 函数。 ```go // 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>

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

813 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传