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

nxlog4go 简介 - 基于log4go的下一代go语言日志系统的更多相关文章

  1. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...

  2. java环境中基于jvm的两大语言:scala,groovy

    一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...

  3. 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。

    快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...

  4. 基于.NET环境,C#语言 实现 TCP NAT

    基于.NET平台和C#语言实现TCP NAT穿越        1.<C# WinForm 跨线程访问控件(实用简洁写法)>       2.<基于.NET环境,C#语言 实现 TC ...

  5. 基于HTML5的燃气3D培训仿真系统

    最近上线了的基于HTML5的燃气3D培训仿真系统,以前的老系统是采用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但因为这次新产品需求要求 ...

  6. C语言嵌入式系统编程修炼之一:背景篇

    不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发 ...

  7. 基于类(Java)和基于原理(JavaScript)的对象系统的比较

    Java:面向对象编程语言,吸收了C++语言的各种优点,丢掉了C++让人头疼的多继承.指针等概念.具有功能强大和简单易用的两大特征.Java具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移 ...

  8. 基于 HTML5 WebGL 的地铁站 3D 可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  9. (2)esp8266多国语言翻译系统

    http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...

随机推荐

  1. 搭建PHP本地服务器(XAMPP)

    1.下载XAMPP集成包 https://www.apachefriends.org/download.html2.启动前修改配置文件httpd.conf的端口号,例如:Listen 80803.启动 ...

  2. Gulp-静态网页模块化

    前言: 在做纯静态页面开发的过程中,难免会遇到一些的尴尬问题.比如:整套代码有50个页面,其中有40个页面顶部和底部模块相同.那么同样的两段代码我们复制了40遍(最难受的方法).然后,这个问题就这样解 ...

  3. JAVA NIO学习四:Path&Paths&Files 学习

    今天我们将学习NIO 的最后一章,前面大部分涉及IO 和 NIO 的知识都已经讲过了,那么本章将要讲解的是关于Path 以及Paths 和 Files 相关的知识点,以对前面知识点的补充,好了言归正传 ...

  4. Hyper-V 虚拟网络设置

    目标:搭建一个主机上的网络用来链接主机和虚拟机,并且虚拟机可以通过主机上网. 步骤一:创建一个Internal Network. 步骤二: 创建虚拟机并设置Virtual Switch. 步骤三:将上 ...

  5. zabbix 3.0.4 中文字体替换

    zabbix 对中文支持不是很好,会出现乱码: 从windows系统里 找到字体包:如图: 拷贝到zabbix-server里面,注意,把文件名改成小写: 我linux 是centos7.2版本 [r ...

  6. Shell脚本实现文件遍历和删除操作

    本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件. 具体实现 大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件:然后循环文件,删除除最大编码外的文 ...

  7. JS 实现图片的预加载(转载)

    图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作. 下面的函数实现了一个我 ...

  8. File API文件操作之FileReader

    近来研究点对点的文件传输,想到一种方案FileReader+WebRtc. 当我看到FileReader的时候,哎呀,不错的东西啊,仔细一看属于File API,或者叫做Web API. File A ...

  9. 对《cookie之困》的一些总结与思考

    0x00 前言 早些时候在gayhub翻安全大会的paper,翻到了kcon的一些paper. https://github.com/knownsec/KCon 从前辈们的paper中学到了不少,也产 ...

  10. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...