刚开始接触log4go项目时,没有注意到配置的重要性。

阅读了log4j、log4net、log4cpp、log4cplus的部分代码,发现它们都是以xml配置来驱动日志系统运行的。


多个源文件共享一个logger

最简单的方式是新建一个logger.go文件。

package main

import (
l4g "github.com/ccpaging/nxlog4go"
"github.com/ccpaging/nxlog4go/color"
"github.com/ccpaging/nxlog4go/file"
"github.com/ccpaging/nxlog4go/socket"
) var log = l4g.GetLogger()

l4g.GetLogger() 从nxlog4go中取出预定义的logger。

或者用l4g.New(l4g.DEBUG) 新建全局 Logger。

var log = l4g.New(l4g.DEBUG)

初始化logger

可以在新建时直接链接配置函数。

var log = l4g.GetLogger().SetCaller(false).SetPattern("[%T] [%L] (%s) %M\n")

或者在init()中配置,如果不使用配置文件的话。

var log = l4g.GetLogger()

init() {
log = log.SetCaller(false).SetPattern("[%T] [%L] (%s) %M\n")
}

准备 xml 配置文件

准备xml配置文件。详见:config.xml

方便的办法是参照以上文件进行修改。

以 color term appender 为例

<logging>
<filter enabled="true">
<tag>color</tag>
<level>DEBUG</level>
<property name="pattern">[%D %T] [%L] (%s) %M%R</property>
</filter>
</logging>
  • enabled - filter attribute

    Filter或称为 Appender的使能属性。enabled = true,打开。enabled = false,关闭。

  • tag

    在log4go里用了两个字段——tag和type。在 nxlog4go 中合并成一个,标识 Appender 的类型。

    在程序中,nxlog4go预装载(Preload)所有可能用到的 Appender,指定每个 Appender 的 tag。

    然后装载配置文件,用 tag 字段匹配 Appender。

    通过 Preload - tag - Load 机制,nxlog4go 可以用配置驱动未知的扩展 Appender。

  • level

    日志过滤级别。nxlog4go仅处理大于等于 level 的日志。

  • property - attribute

    每种 Appender 都有自己的 Options。

    例如上例中设置 PatternLayout 的Pattern。“%R”表示回车换行,即程序中的“\n”。

    通过参看源文件可以获得详细的信息。例如:filelog.go

func (fa *FileAppender) SetOption(name string, v interface{}) error {
fa.mu.Lock()
defer fa.mu.Unlock() switch name {
case "filename":
...
case "flush":
...
case "maxbackup":
...
case "cycle":
...
case "clock", "delay0":
...
case "daily":
...
case "maxsize":
...
case "pattern", "format", "utc":
...
case "head":
...
case "foot":
...
default:
return l4g.ErrBadOption
}
return nil
}

装载 xml 配置驱动nxlog4go运行

func main() {
// 打开xml配置文件
fd, err := os.Open(filename)
if err != nil {
panic(fmt.Sprintf("Can't load xml config file: %s %v", filename, err))
}
// 读取xml内容到buf
buf, err := ioutil.ReadAll(fd)
if err != nil {
fmt.Fprintf(os.Stderr, "Could not read %q: %s\n", filename, err)
os.Exit(1)
}
// 关闭配置文件
fd.Close() // 新建logger config, 具体结构详见filters.go, appender.go
xc := new(l4g.LoggerConfig)
if err := xml.Unmarshal(buf, xc); err != nil {
fmt.Fprintf(os.Stderr, "Could not parse XML configuration. %s\n", err)
os.Exit(1)
} // 新建filters
fs := l4g.NewFilters() // 预装载所有可能用到的 Appender
fs.Preload("color", colorlog.NewAppender())
fs.Preload("file", filelog.NewAppender("_test.log", 0))
fs.Preload("socket", socketlog.NewAppender("udp", "127.0.0.1:12124")) // 预装载 xml 格式日志文件
xa := filelog.NewAppender("_test.log", 0)
xa.SetOption("head","<log created=\"%D %T\">%R") xa.SetOption("pattern",
` <record level="%L">
<timestamp>%D %T</timestamp>
<source>%S</source>
<message>%M</message>
</record>%R`) xa.SetOption("foot", "</log>%R")
fs.Preload("xml", xa) fmt.Println(len(*fs), "appenders pre-installed") // 装载配置并自动删除未用的appender
fs.LoadConfiguration(xc.Filters)
if filt, isExist := (*fs)["color"]; isExist {
// 已有 color term appender. 关闭缺省的 writer
log.SetOutput(nil)
}
log.SetFilters(fs)
fmt.Println(len(*fs), "appenders configured ok") // And now we're ready!
log.Finest("This will only go to those of you really cool UDP kids! If you change enabled=true.")
log.Debug("Oh no! %d + %d = %d!", 2, 2, 2+2)
log.Trace("Oh no! %d + %d = %d!", 2, 2, 2+2)
log.Info("About that time, eh chaps?") log.Shutdown() // 或者分步执行 // 卸载filters
// log.SetFilters(nil)
// 关闭全部filters
// fs.Close()
}

xml 格式的日志文件

附带实现了xml格式的日志文件。简单的设置 Head, Foot, 和PatternLayout就可以。例如:

	xa := filelog.NewAppender("_test.log", 0)
xa.SetOption("head","<log created=\"%D %T\">%R") xa.SetOption("pattern",
` <record level="%L">
<timestamp>%D %T</timestamp>
<source>%S</source>
<message>%M</message>
</record>%R`) xa.SetOption("foot", "</log>%R")

生成的日志文件内容如下:

<log created="2018/03/26 13:50:25">
<record level="TRAC">
<timestamp>2018/03/26 13:50:25</timestamp>
<source>f:/go/src/github.com/ccpaging/nxlog4go/examples/xmlconfig.go</source>
<message>Oh no! 2 + 2 = 4!</message>
</record>
<record level="INFO">
<timestamp>2018/03/26 13:50:25</timestamp>
<source>f:/go/src/github.com/ccpaging/nxlog4go/examples/xmlconfig.go</source>
<message>About that time, eh chaps?</message>
</record>
  • 只有滚动日志文件时才会写入 Foot

参考源文件

jsonconfig.go

xmlconfig.go

nxlog4go 的配置驱动的更多相关文章

  1. visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  2. [内核编程] visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  3. Ubuntu server16.04安装配置驱动418.87、cuda10.1、cudnn7.6.4.38、anaconda、pytorch超详细解决

    目录 安装GCC 安装NVIDIA驱动 1. 卸载原有驱动(没装跳过) 2. 禁用nouveau 3. 安装NVIDIA显卡驱动 安装CUDA10.1 安装cudnn 安装anaconda 安装ten ...

  4. IGH_Master主站配置驱动伺服电机和变频器总结

    IGH_Master主站配置驱动伺服电机和变频器总结 Ethercat是倍福公司提出的一种工业现场总线协议,具有很好的实时性,IGH是一种开源的Ethercat主站实现协议,本文总结了一下使用IGH_ ...

  5. WINDOWS7(vs2012+wdk7.6) 配置驱动开发环境

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 1.新建C ...

  6. Vs2010 配置驱动的开发环境

    我已被用来VS2010开发环境,之前曾经与vs2010驱动的开发环境.重装系统,一次又一次的配置,找了好几篇文章,配置没有成功,在配置阶段突然成功了,直接把原来的驱动程序的配置文件将能够接管使用. 当 ...

  7. VS2005、vs2008+WinXPDDK+DDKWizard配置驱动开发环境

    所需软件下载地址如下(均为有效资源链接,速度都比较可以): vs2005:    http://221.224.22.210/downloadsawyer/VS.Net2005简体中文版.rar wi ...

  8. win7+vs2010配置驱动开发环境(问题种种版...)

     本来按照这个来做,能跑通helloworld,可是复杂的驱动就会出错....不知道什么原因,后来就直接用命令行来编译的. -------------------------------------- ...

  9. 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯

    灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...

随机推荐

  1. Android的微信智能心跳方案

    原文地址: 年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了差不多两个多礼拜 ...

  2. 运行Java Web项目报错

    运行Java Web项目报错 今天,我启动服务,发现项目报错,并且是在打开登录界面时报错. 具体错误如下: org.apache.catalina.core.Standard WrapperValue ...

  3. java中equals和==以及toString

    我们通常在控制台输出时使用System.out.print(),print只能直接输出基本类型和字符串,对于其他的类型直接输出将会输出@开头的引用,因此若需要输出对应的内容则需要使用toSring方法 ...

  4. Vue项目搭建及原理三

    我每次写博客都要先在本地写一遍草稿,所以之前有些发布顺序可能会有一丢丢凌乱 哈哈哈,以后绝对改正,那下面我们就说一下创建及项目目录结构吧 三.创建项目 1.初始化Webpack p.p1 { marg ...

  5. hibernate学习(三) hibernate中的对象状态

    hibernate对象的状态分为三种:  游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration   cfg=new Configuration().configure(); ...

  6. 芝麻HTTP: 1.9.3-Scrapyd-Client的安装

    在将Scrapy代码部署到远程Scrapyd的时候,第一步就是要将代码打包为EGG文件,其次需要将EGG文件上传到远程主机.这个过程如果用程序来实现,也是完全可以的,但是我们并不需要做这些工作,因为S ...

  7. Tornado模块

    Tornado 一个轻量级的Web框架 简介 1.Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的框架.此外,它还拥有处理安全性.用户验证.社 ...

  8. 页面jquery调试的一个宝贵经验(类似于Eclipse中的写出一个对象点它的方法时候用alt加/可以跳出来它所有的方法)

    案例讲解 一,html片段 <div class="page-upload"> <div class="tab-wrapper2"> & ...

  9. 【转载】Java并发编程:volatile关键字解析(写的非常好的一篇文章)

    原文出处: 海子 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volat ...

  10. jquery中的事件与应用

    mouseover和mouseenter的区别 mouseenter的定义是当鼠标穿过该元素才会被执行,而mouseover是当鼠标穿过该元素或者其子元素皆会触发该事件 mouseleave一般是与m ...