log4cplus入门
转载http://wgwang.github.com/tech/misc/log4cplustutorial.html#id8
介绍
log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库。它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到程序中,便于部署。
当前的最新稳定版本是1.04,也是下面的例子中所用到的版本。
从这个版本中所了解到的,log4cplus并未完全实现了log4j,不少细节部分都没有实现。但这并不妨碍我们使用它。
下面是一些log4cplus资源:
- log4cplus project: http://log4cplus.sourceforge.net/index.html
- 1.04版本下载: http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.0.4/log4cplus-1.0.4.tar.bz2/download
- log4cplus svn: svn co https://log4cplus.svn.sourceforge.net/svnroot/log4cplus log4cplus
- log4cplus 官方文档: http://log4cplus.sourceforge.net/docs/html/index.html
编译
log4cplus没有太复杂的依赖关系,编译器来很简单,一般情况下使用默认情况即可。有一点可以提一下,如果不想将编译好的库安装在默认路径下,可以在./configure的时候加入参数: –prefix=/the/path/you/want/to/install/the/log4cplus
实例
需求
以一个典型的需求(笔者的经历)简单实现一个例子。需求是这样的:
- 用文件配置
- 自动切割日志,按小时切割
- 保留8天日志(更长时间的日志会转移到其他专门的日志服务器上)
- 指定输出的日志格式(便于日志分析)
配置
下面是整理好的配置文件,命名为:log.properties,内容如下:
log4cplus.rootLogger=TRACE, R
log4cplus.appender.R=log4cplus::DailyRollingFileAppender
log4cplus.appender.R.File=./log/test.log
log4cplus.appender.R.MaxBackupIndex=192 #8 * 24
log4cplus.appender.R.Schedule=HOURLY
log4cplus.appender.R.Append=true
log4cplus.appender.R.layout=log4cplus::PatternLayout
log4cplus.appender.R.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q} %i:%t %F:%L "%m"%n
程序
简单的示例程序如下:
#include <cstdlib>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/stringhelper.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
int main()
{
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log.properties"));
Logger logger = Logger::getRoot();
// trace
LOG4CPLUS_TRACE(logger, "trace and get the fingerprint: " << "random integer: "<< random());
// debug
LOG4CPLUS_DEBUG(logger, "this is debug log: " << "random integer: "<< random());
// info
LOG4CPLUS_INFO(logger, "the information centry...." << "[ 1 + 1 = " << 1 + 1 << "]");
// warn
LOG4CPLUS_WARN(logger, "Writing warning messages to log....");
// error
LOG4CPLUS_ERROR(logger, "ooooooh, there is an error....");
//fatal
LOG4CPLUS_FATAL(logger, "oh, my god! the fatal error occur!!!!!!!!!");
return 0;
}
配置说明
-
文件配置
log4cplus提供一个类【PropertyConfigurator】来实现从文件读取配置,参数就是文件名。其他参数采用默认。
-
按时间切割日志,需要在配置文件中配置appender为【DailyRollingFileAppender】,对应的一个参数是文件名,可以用程序启动时的相对路径,不过绝对路径会更好。
-
按小时切割日志,以及保留8天,体现在配置文件中为如下两个参数:
- log4cplus.appender.R.MaxBackupIndex=192 #8 * 24
- log4cplus.appender.R.Schedule=HOURLY
-
最后,是一个用来配置日志输出格式的配置项,如下:
- log4cplus.appender.R.layout=log4cplus::PatternLayout
- log4cplus.appender.R.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q} %i:%t %F:%L “%m”%n
日志格式的说明,见后面的附录资源。
-
配置项的第一行【log4cplus.rootLogger=TRACE, R】会跟cpp代码一起来区别不同的logger和日志输出级别,分别说明如下:
-
选择logger
Logger logger = Logger::getRoot(); 这个用来选择rootLogger的,其他的还可以配置更多的logger,一般情况下不是很需要。
-
日志输出级别 TRACE
这个可以控制日志输出,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。log4cplus支持如下日志级别,使用方法可以看cpp代码。
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。
- 日志文件名:当前版本不支持对后面日期格式的配置,日期格式是硬编码到程序中的。对于按小时切割日志格式的,文件为配置的文件名后附加“.yyyy-mm-dd-HH”。另外,在一个小时内多次启动程序,会在其后增加“.1”,“.2”……等,并不会append到同一个文件中,这点不是太好。
-
程序说明
使用方式见上述的示例代码即可。两点说明下:
- 如【LOG4CPLUS_FATAL】这类的宏,可以重新用宏定义为自己熟悉的方式
- log4cplus的日志输出是用c++的stream的方式,用<<符号输出不同的字段。对于喜欢用c string format方式的话,需要在其上封装一层。
附录
ConversionPattern配置说明
见: http://log4cplus.sourceforge.net/docs/html/classlog4cplus_1_1PatternLayout.html
其他appender
log4cplus还支持如下一些打印日志的方式(appender):
- RollingFileAppender:按文件大小切分日志
- SocketAppender:把日志打印到网络socket中,适合实时日志分析等。另外应该支持将日志同时打印到本地文件和socket中,这样可以实现本地正常打印日志,网络来做实时统计等。
- ConsoleAppender: 打印日志到标准输出