zoukankan      html  css  js  c++  java
  • nxlog4go 简介

    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 >= 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

  • 相关阅读:
    curl 命令行使用参考
    PHP 输出json_encode 空白的检查
    RAM和ROM
    浮点数
    负数补码
    位运算
    无法加载文件 C:UsershuangshiminAppDataRoaming pmwechat-terminal.ps1,因为在此系统上禁止运行脚本
    windows + php + shell_exec 执行失败的可能原因
    Ubuntu 发送邮件
    红黑树
  • 原文地址:https://www.cnblogs.com/ccpaging/p/nxlog4go_intro.html
Copyright © 2011-2022 走看看