日志操作利器log4cxx 分享

转载 2013年12月04日 18:31:58


前言:

log4cxx的配置文件完全和log4j相同,但是比较别扭的地方就是log4j使用com.aa.bb这样组织类,用在log4cxx中多少有点别扭(无论如何也不会有人在命名空间中嵌套那么多)。

http://erera.net/blog/log4cxx.html

日志操作利器log4cxx

今天看了一场今年WCG的比赛,jaedong对阵stork,非常精彩。突然感觉星际里的微操和大局观就类同C和C++的开发,写C代码的时候就满脑子的字节、移位、共享内存、文件描述符之类的,C++就考虑类、模板、重载、IO流、标准库了。这只是个引子,在C开发一直用openlog(), syslog() 来记录日志,虽然方便,但不够强大。今天来看一下C++中的一些日志操作库。

流行的一些C++日志库有好些,比如 log4cplus, log4cpp, log4cxx, boost log 功能依次增强吧。

当前的状况是,log4cplus已然停止开发许久;log4cpp去年突然有了更新,升级到1.0稳定版;log4cxx今年有了更新,现在属于 apache的一个项目;boost log功能最强,而且文档十分详尽,不过不清楚为何当年申请进入boost库被reject。前三个有着共同的前缀log4,意思是它们都是从 apache优秀的log4j日志操作库port出来的。优秀的实现总是在多个语言和平台上都会被人借鉴。

文档状况是,除了boost log外文档都很匮乏,主要参照内容就是doxygen生成的API文档。

性能上,一些早期的资料表明log4cpp性能相当出众,它也是较早移植log4j的C++库,log4cxx是后来apache自己的一个移植,具体性能影响和你使用的配置有关系。log4cxx是个线程安全并且支持多种appender的日志库。

其他细节,log4cpp提供了一个对比表

log4cxx

log4j日志系统由三大类组成,它们又各自派生出不同功能的子类:

  • Layout 用来控制输出日志消息的显示样式
  • Appender 用来输出日志到某些设备上,比如文件、syslog、socket等
  • Category 在log4cxx里叫作 Logger,真正完成日志记录功能
按日期记录日志

这里给出一个最常用的例子,就是按日期生成日志,但是代码异常简单。

#include <log4cxx/logmanager.h>
#include <log4cxx/xml/domconfigurator.h>
#include <log4cxx/patternlayout.h>
#include <log4cxx/rolling/rollingfileappender.h>
#include <log4cxx/rolling/fixedwindowrollingpolicy.h>
#include <log4cxx/rolling/filterbasedtriggeringpolicy.h>
#include <log4cxx/filter/levelrangefilter.h>
#include <log4cxx/helpers/pool.h>
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/dailyrollingfileappender.h>
#include <log4cxx/helpers/stringhelper.h>
 
using namespace log4cxx;
using namespace log4cxx::rolling;
using namespace log4cxx::xml;
using namespace log4cxx::filter;
using namespace log4cxx::helpers;
 
void dailyRolling() {
    PropertyConfigurator::configure(File("/etc/log4cxx.properties")); // Configure file, log4j format
    LoggerPtr logger(Logger::getLogger("org.apache.log4j.DailyRollingFileAppender")); // Appender name
 
    LOG4CXX_DEBUG(logger, "Hello World!");    // Debug level
    LOG4CXX_INFO(logger, "Log4cxx's birth."); // INFO level
} log4j配置

虽然C++代码可以写的很简单,但是我们可以进行很复杂的配置,让log4cxx灵活的记录信息,比如上边指定了配置文件/etc/log4cxx.properties,这是一个Java特性文件:

Log4j配置由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。逐一解释下:
日志信息的优先级

Logger的语法:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关。比如这里定义了 INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName名字任意,用来标示日志信息输出到哪里,可以同时指定多个。

日志信息的输出目的地

Appender的语法:

log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN

其中,Log4j提供的appender有以下几种:

  • org.apache.log4j.ConsoleAppender 控制台
  • org.apache.log4j.FileAppender 文件
  • org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件
  • org.apache.log4j.RollingFileAppender 文件大小到达指定尺寸的时候产生一个新的文件
  • org.apache.log4j.WriterAppender 将日志信息以流格式发送到任意指定的地方
日志信息的输出格式

Layout的语法:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的Layout有以下几种:

  • org.apache.log4j.HTMLLayout 以HTML表格形式布局
  • org.apache.log4j.PatternLayout 可以灵活地指定布局模式
  • org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串
  • org.apache.log4j.TTCCLayout 包含日志产生的时间、线程、类别等等信息

Log4j采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

  • %m 输出代码中指定的消息
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该log信息耗费的毫秒数
  • %c 输出所属的类目,通常就是所在类的全名
  • %t 输出产生该日志事件的线程名
  • %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出2008年11月14日 15:16:17,890
  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

转载地址:http://saupb.blog.163.com/blog/static/4712417820112951932781/

日志操作利器log4cxx 分享

资料出处:http://saupb.blog.163.com/blog/static/4712417820112951932781/前言:log4cxx的配置文件完全和log4j相同,但是比较别扭的地...
  • Augusdi
  • Augusdi
  • 2013年05月29日 16:15
  • 2471

日志操作利器log4cxx 分享

前言: log4cxx的配置文件完全和log4j相同,但是比较别扭的地方就是log4j使用com.aa.bb这样组织类,用在log4cxx中多少有点别扭(无论如何也不会有人在命名空间中嵌套那么多)。...
  • lizhifa2011
  • lizhifa2011
  • 2017年04月17日 16:21
  • 262

日志操作利器log4cxx 分享

前言: log4cxx的配置文件完全和log4j相同,但是比较别扭的地方就是log4j使用com.aa.bb这样组织类,用在log4cxx中多少有点别扭(无论如何也不会有人在命名空间中嵌套那么多...
  • loveyaqin1990
  • loveyaqin1990
  • 2014年12月05日 14:40
  • 392

C++日志系统log4cxx使用总结

 本文主要从log4cxx级别、layout、格式化、命名规则、Filter几个方面介绍。   一、log4cxx命名规则         Logger由一个String类的名字识别,lo...
  • liangzhao_jay
  • liangzhao_jay
  • 2013年12月04日 10:58
  • 988

log4cxx 在C++日志中的应用

 1.     介绍 Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开...
  • liangzhao_jay
  • liangzhao_jay
  • 2013年12月04日 14:21
  • 1234

C++ log4cxx日志打印配置文件详解

 以下我的配置文件,设置每秒产生一个文件(testAppender)是可以的,但是每天产生一个文件(DAILY_FILE)就是不行,有用过的人能发以下每天产生一个文件的配置么? log4j.r...
  • liangzhao_jay
  • liangzhao_jay
  • 2013年12月04日 14:17
  • 1860

log4cxx配置文件(log4cxx.properties文件)详解 --调整日志输出级别

1、 log4cxx简介 Log4cxx有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式...
  • liujianmao
  • liujianmao
  • 2017年11月08日 11:14
  • 95

log4cxx第三篇----使用多个logger

 转载自: 使用多个logger时,所有logger的配置写在一个配置文件里面 两个例子: 1 一个继承的例子(http://logging.apache.org/log4cxx/) ...
  • qq51931373
  • qq51931373
  • 2014年11月13日 18:22
  • 938

log4CXX在windows上编译与应用

Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。...
  • u010028271
  • u010028271
  • 2014年03月07日 18:49
  • 1355

log4cxx日志库RedHat下安装

今天领导交给我一个任务:把log4cxx库在Redhat系统上面安装起来 首先,我得到信息,安装这个库一共需要三个软件 apr-1.4.6.tar.gz apr-util-1.4.1.tar.gz ...
  • ma52103231
  • ma52103231
  • 2014年07月21日 23:16
  • 1475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:日志操作利器log4cxx 分享
举报原因:
原因补充:

(最多只允许输入30个字)