log4cpp之快速入门

一、简介
log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。
log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。

二、原理
log4cpp有3个主要的组件:categories(类别)、appenders(附加目的地)、和 layouts(布局)。
1、layouts(布局)
layout类控制输出日志消息的显示样式,log4cpp当前提供以下layout格式:
log4cpp::BasicLayout //格式:时间戳 优先级 类别: 日志信息
//比如:1056638652 INFO main: This is some info
log4cpp::PatternLayout //让用户根据类似于C语言printf函数的转换模式来指定输出格式
log4cpp::SimpleLayout //以“优先级 - 日志信息”格式显示
2、appenders(附加目的地)
appender类用来输出日志(被layout格式化后的)到一些设备上,比如文件、syslog服务、某个socket等。可以定义自己的appender类输出日志信息到别的设备上,比如应用自身的日志处理进程、数据库等。appender和layout的关系是layout附在appender上,appender类调用layout处理完日志消息后,记录到某个设备上。log4cpp当前提供以下appender:
log4cpp::IdsaAppender //发送到IDS或者logger,
log4cpp::FileAppender //输出到文件
log4cpp::RollingFileAppender //输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender //输出到一个ostream类
log4cpp::RemoteSyslogAppender //输出到远程syslog服务器
log4cpp::StringQueueAppender //输出到内存队列
log4cpp::SyslogAppender //输出到本地syslog
log4cpp::Win32DebugAppender // 发送到缺省系统调试器
log4cpp::NTEventLogAppender // 发送到win事件日志
3、categories(类别)
category 类真正完成记录日志功能,两个主要组成部分是appenders和priority(优先级)。优先级控制哪类日志信息可以被这个category记录,当前优先级分为:NOTSET、DEBUG、INFO、NOTICE、WARN、ERROR、CRIT、 ALERT、FATAL/EMERG,具体如下:
typedefenum {
EMERG = 0,
FATAL = 0,
ALERT = 100,
CRIT = 200,
ERROR = 300,
WARN = 400,
NOTICE =500,
INFO = 600,
DEBUG = 700,
NOTSET =800
}PriorityLevel;
每个日志信息有个优先级,每个category有个优先级,当消息的优先级大于等于category的优先级时,这个消息才会被category记录,否则被忽略。取值越小,优先级越高,例如一个Category的优先级为101,则所有EMERG、FATAL、ALERT日志都可以记录下来,而其它则不能。
category类和appender的关系是,多个appender附在category上,这样一个日志消息可以同时输出到多个设备上。

三、配置
log4cpp可以通过读取配置文件,确定category、appender、layout等对象以便于灵活地通过配置文件定义所有对象及其属性,不用重新编码就可以动态更改日志记录的策略。
log4cpp主要提供了log4cpp::PropertyConfigurator和log4cpp::SimpleConfigurator两种机制(文件格式)。这里以log4cpp::PropertyConfigurator为例说明之(log4cpp::SimpleConfigurator即将废弃):
#定义category,指定优先级
log4cpp.rootCategory = DEBUG,MAIN
#设置appenders和layouts
log4cpp.appender.MAIN = org.apache.log4cpp.RollingFileAppender
log4cpp.appender.MAIN.fileName = /var/logs/test.log
log4cpp.appender.MAIN.maxFileSize = 10485760
log4cpp.appender.MAIN.maxBackupIndex = 1
log4cpp.appender.MAIN.backupPattern = %Y-%m-%d
log4cpp.appender.MAIN.layout = org.apache.log4cpp.PatternLayout
log4cpp.appender.MAIN.layout.ConversionPattern = %d{%Y-%m-%d %H:%M:%S} [%p]: %m%n

四、使用
1、编译安装
点击这里下载源码,这里以log4cpp-1.1.1.tar.gz为例说明之:
#tar xzvf log4cpp-1.1.1.tar.gz
#cd log4cpp
#./configure --with-pthreads //增加多线程支持
#make
#make check
#make install
安装完成后,include文件 和lib文件分别被安装到以下目录:
/usr/local/include
/usr/local/lib
2、简单实例
#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"

int main(int argc, char* argv[])
{
//读取解析配置文件
log4cpp::PropertyConfigurator::configure("./log4cpp.conf");

//实例化category对象
// log4cpp::Category* root = &log4cpp::Category::getRoot();
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& main =
log4cpp::Category::getInstance(std::string("MAIN"));

//使用category对象进行日志处理
main.debug("This is debug");
main.info("This is info");
main.alert("This is alert");

return 0;
}
#g++ -o main -llog4cpp main.cpp
#./main
如果出现如下错误,说明没有链接上pthread库,加上-lrt即可:
/usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_create'
/usr/local/lib/liblog4cpp.so: undefined reference to `pthread_getspecific'
/usr/local/lib/liblog4cpp.so: undefined reference to `pthread_key_delete'
/usr/local/lib/liblog4cpp.so: undefined reference to `pthread_setspecific'
#g++ -o main -llog4cpp -lrt main.cpp
#./main
如果出现如下错误,则说明找不到so:
./main: error while loading shared libraries: liblog4cpp.so.5: cannot open shared object file: No such file or directory
#ldconfig
执行上面命令更新/etc/ld.so.cache
#./main
#cat /var/logs/test.log
2014-09-02 11:10:19 [DEBUG]: This is debug
2014-09-02 11:10:19 [INFO]: This is info
2014-09-02 11:10:19 [ALERT]: This is alert
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值