我个人的log4cplus-1.2.1的编译与测试使用,CentOS环境

https://sourceforge.net/projects/log4cplus/

https://sourceforge.net/p/log4cplus/wiki/Home/

http://log4cplus.sourceforge.net/docs/html/index.html

https://github.com/log4cplus/log4cplus

说起日志系统,不得不提大名鼎鼎的Log4j。特别是使用Java的人们,能够说是无人不知无人不晓无人不用。
Log4j以其简单的使用方式(引入一个jar包。一行代码就可以调用)。灵活(可通过配置文件任意配置),功能强大(多个级别。可配置多个输出目的地,Console,File。系统日志。远端的LogServer等等,可订制日志格式,自己主动产生,删除日志文件)等等等等特性,一直是Java日志系统的首选。
Log4cplus简介:
log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad
E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
选型比较:
log4cxx:Apache的产品,属于apache的子项目之一,由log4j移植过来的。移植过来的东西多数都有一个特点,那就是要依赖各种碗糕。log4cxx就需要依赖apr-utils,编译起来没那么直接,因此我放弃了它。而且这个库最新版本是0.10.0,最近几年都不怎么更新了。
log4cpp:感觉上log4cpp和log4cplus大同小异,支持的功能也类似。上上一次更新是在2007年,不过在时隔五年之后的去年年底(2012年),它突然又更新了, 从1.0版提升到了1.1版,有点不容易,感觉诈尸了。另外,它也是由log4j移植过来的。
log4cplus:log4cplus究竟和log4cpp区别在哪,如果一定要作对比似乎log4cplus比log4cpp复杂了那么一点点。log4cplus的功能比log4cpp支持的功能更加全面,支持线程安全(log4cpp的代码里也做了一些对线程安全的保证,但官方没有介绍它支持线程安全,但是我自己在centos 6.2上面编译log4cpp后发现其不支持多线程,详情:http://sourceforge.net/p/log4cpp/feature-requests/34/。反而log4cplus宣称自己是线程安全的),另外log4cplus更新非常频繁,对于一个有版本洁癖的人来说,这也是我选择它的原因,新版本提供了vc10的解决方案,还支持可选编译Unicode和非Unicode版本。
glog:这个就不介绍了,全称Google Glog, Google的东西一直比较让人放心。它比log4系列的库都要简单,不过它不支持用配置文件控制日志行为,这对我来说是个遗憾。
zlog: 使用C编写,支持window和linux,但是Linux下有些问题,所以放弃了。
log4系列的库前身都是log4j,log4j真是深藏功与名。以下通过log4plus来介绍一下它的基本用法和魅力。

总之,折腾了log4cplus,log4cxx,log4cpp,最终选择log4cplus。
log4cplus: 简洁, 下载的包编译顺利, 测试例子也能顺利运行。log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库。它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到程序中,便于部署。
log4cxx: 臃肿, 需要引用apr(Apache Portable Runtime), 最痛苦的是老是编译不了。

log4cpp: 落后, 最后更新于2007年,而且下载的包不完整。

 

一、安装

环境是CentOS 7.3,gcc 4.8.5

tar xvzf log4cplus-1.2.1.tar.gz
cd log4cplus-1.2.1
./configure --prefix=/where/to/install
make
make install

这里我采用缺省安装路径:

库文件在/usr/local/lib

头文件在/usr/local/include/log4cplus

 

在编译log4cplus的,configure默认不生成静态库文件,如果需要修改log4cplus中的代码,而目前项目已经大面积使用了log4cplus,并且是动态加载log4cplus.so文件的,覆盖log4cplus.so*文件就会导致现在已经启动的进程异常中止,所以如果有需要修改源码的项目,建议静态加载。

生成静态库的方法为:./configure --enable-static

编译成功之后,生成的库文件位置为.libs目录。

查看log4cplus 的configure命令为./configure -h

静态加载时注意事项:在Makefile 记得加上-lrt选项,不然make会出错。

 

二、实例,完整工程下载:http://download.csdn.net/download/libaineu2004/10256030

 

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include  //std::setprecision

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

int main()
{
    log4cplus::initialize();

    //log4cplus.rootLogger//
    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
    int i = 10;
    LOG4CPLUS_WARN(logger, "Writing warning messages to log...." << i);
    // error
    LOG4CPLUS_ERROR(logger, "ooooooh, there is an error....");
    //fatal
    LOG4CPLUS_FATAL(logger, "oh, my god! the fatal error occur!!!!!!!!!");

    LOG4CPLUS_DEBUG(logger, "This is a bool: " << true);
    LOG4CPLUS_INFO(logger, "This is a char: " << 'x');
    LOG4CPLUS_WARN(logger, "This is a int: " << 1000);
    LOG4CPLUS_ERROR(logger, "This is a long(hex): " << std::hex << 100000000);
    LOG4CPLUS_FATAL(logger, "This is a double: " << std::setprecision(15) << 1.2345234234);

    //log4cplus.logger.test//
    Logger loggerTest  = log4cplus::Logger::getInstance("test");
    LOG4CPLUS_TRACE(loggerTest,"anther logger,trace");
    LOG4CPLUS_ERROR(loggerTest,"anther logger,error ");

    log4cplus::Logger::shutdown();

    return 0;
}


log.properties

 

log4cplus.rootLogger=ERROR, R
log4cplus.appender.R=log4cplus::ConsoleAppender
log4cplus.appender.R.File=./log/error.log
log4cplus.appender.R.MaxFileSize=500KB  
log4cplus.appender.R.MaxBackupIndex=5
log4cplus.appender.R.Schedule=HOURLY
log4cplus.appender.R.Append=true
log4cplus.appender.R.layout=log4cplus::PatternLayout
log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S,%Q}] [%t] %-5p - %m%n[%p]


log4cplus.logger.test=TRACE, RR
log4cplus.appender.RR=log4cplus::DailyRollingFileAppender
log4cplus.appender.RR.File=./log/test.log
log4cplus.appender.RR.MaxFileSize=500KB 
log4cplus.appender.RR.MaxBackupIndex=192 #8 * 24
log4cplus.appender.RR.Schedule=HOURLY
log4cplus.appender.RR.Append=true
log4cplus.appender.RR.layout=log4cplus::PatternLayout
log4cplus.appender.RR.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q}:%t %F:%L "%m"%n

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(mylog4cplusTest)

find_library(LOG4CPLUS_LIB liblog4cplus.so /usr/local/lib/)
IF (NOT LOG4CPLUS_LIB)
    MESSAGE(FATAL_ERROR "log4cplus not found")
ENDIF(NOT LOG4CPLUS_LIB)

add_executable(${PROJECT_NAME} "main.cpp" )
TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cplus)


编译通过,但是运行时会报错:error while loading shared libraries: liblog4cplus.so: cannot open shared object file: No such file or directory
此时需要在/etc/ld.so.conf中加入liblog4cplus.so所在的目录:/usr/local/lib/
然后在终端执行命令,使之生效:
[root@localhost etc]# ldconfig
注意,/usr/local/lib/每次有库文件更新,都需要终端重新运行一次ldconfig这条命令。

 

 

 

三、说明

log4cplus提供一个类【PropertyConfigurator】来实现从文件读取配置,参数就是文件名。其他参数采用默认。
配置文件内容如下:
1.  选择logger
Logger logger = Logger::getRoot(); 这个用来选择rootLogger的其他的还可以配置更多的logger,Logger logger = log4cplus::Logger::getInstance("test");一般情况下不是很需要。

2.  日志输出级别 TRACE
 logger名称之后的第一个参数可以控制日志输出,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。log4cplus支持如下日志级别,使用方法可以看cpp代码。
 •TRACE •DEBUG •INFO •WARN •ERROR •FATAL
上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。 

3.  appender配置
每个logger可以添加appender,在logger后面的第二个参数即为apppender
如这个例子:log4cplus.rootLogger=ERROR, R
名称为R的appender
在appender上可以设置日志输出位置、日志路径、layout等等内容
a.日志文件名
通过配置项:log4cplus.appender.R.File=./log/error.log        

4.  appender输出位置
(1)控制台输出
ConsoleAppender
(2)文件输出
FileAppender / RollingFileAppender / DailyRollingFileAppender . 

RollingFileAppender使用MaxFileSize设置一个日志文件的最大大小,当产生多个日志时,会在日志名称后面加上".1"、".2"、……这样的后缀,我们可以看到RollingFileAppender有个属性MaxBackupIndex,这个属性通过限制日志文件名后缀".n"中的n大小来限制日志数量,比如上面MaxBackupIndex=10,其实最大日志数量为11。我们知道这个有这个限制是很必要的,当我们的程序在服务器上运行时,随着时间的迁移,日志会越来越多,如果对日志数量没有限制,日志大小会越来越大,最后甚至占满整个硬盘。
DailyRollingFileAppender特点是固定周期时间生成一个日志文件,比如,默认情况是每天生成一个文件。这种日志可以方便根据时间来定位日志位置,使日志清晰易查。但是这种日志有个不好地方是,不能限制日志数量,MaxBackupIndex属性和MaxFileSize在DailyRollingFileAppender中是无效的,我们上面已经提到限制日志数量的必要性。这里有两个解决办法:
linux上crontab+shell
用户程序里面起一个线程,定期扫描日志文件夹。

更详细的介绍请参见:log4cplus库:将日志写入到文件

 

5.  layout
layout是控制日志输出格式的
log4cplus.appender.R.layout=log4cplus::PatternLayout
log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d%H:%M:%S,%Q}] [%t] %-5p - %m%n 
格式包括三种类型:
1.) SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-"。 
2.) TTCCLayout 其格式由时间,线程ID,Logger和NDC 组成。 
3.) PatternLayout 是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。
在PatternLayout格式有以下选项:
(1)"%%",转义为% 。
(2)"%c",输出logger名称,如test.subtest 。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。
(3)"%D",显示本地时间,比如:"2004-10-16 18:55:45",%d显示标准时间。   
可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的预定义标识符如下:
   %a -- 表示礼拜几,英文缩写形式,比如"Fri"
    %A -- 表示礼拜几,比如"Friday"
    %b -- 表示几月份,英文缩写形式,比如"Oct"
   %B -- 表示几月份,"October"
   %c -- 标准的日期+时间格式,如"Sat Oct 16 18:56:19 2004"
   %d -- 表示今天是这个月的几号(1-31)"16"
   %H -- 表示当前时刻是几时(0-23),如"18"
   %I -- 表示当前时刻是几时(1-12),如"6"
   %j -- 表示今天是哪一天(1-366),如"290"
   %m -- 表示本月是哪一月(1-12),如"10"
   %M -- 表示当前时刻是哪一分钟(0-59),如"59"
   %p -- 表示现在是上午还是下午,AM or PM
   %q -- 表示当前时刻中毫秒部分(0-999),如"237"
   %Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"
   %S -- 表示当前时刻的多少秒(0-59),如"32"
   %U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"
   %w -- 表示礼拜几,(0-6, 礼拜天为0),如"6"
   %W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41"
   %x -- 标准的日期格式,如"10/16/04"
   %X -- 标准的时间格式,如"19:02:34"
   %y -- 两位数的年份(0-99),如"04"
   %Y -- 四位数的年份,如"2004"
   %Z -- 时区名,比如"GMT"
(4)"%F",输出当前记录器所在的文件名称,比如"main.cpp"
(5)"%L",输出当前记录器所在的文件行号,比如"51"
(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"
(7)"%m",输出原始信息。
(8)"%n",换行符。

(9)"%p",输出LogLevel,比如"DEBUG"
(10)"%t",输出记录器所在的线程ID,比如 "1075298944"
(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。
(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。
 

 本例使用:log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d%H:%M:%S,%Q}] [%t] %-5p - %m%n

 

---

参考文章:http://www.cnblogs.com/james1207/p/3328996.html

你可能感兴趣的:(debug&&log,Linux,C/C++)