Log4cplus使用

1.1 简介

log4cplus是C++编写的开源日志系统,前身是java编写的log4j日志系统。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 你可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。

最新版本可以从"http://log4cplus.sourceforge.net"下载log4cplus-x.x.x。

1.2 LOG4CPLUS的安装

1.2.1 Linux下安装

①使用 tar xvzf log4cplus-x.x.x.tar.gz将log4cplus解压到当前目录。
②cd log4cplus-x.x.x进到log4cplus主目录下。
③执行当前目录下的./configure。
④然后通过make命令进行编译。
⑤通过make install命令进行安装。
⑥到此log4cplus已经在你的机器上安装完成,下面就可以使用了。
⑦特别说明,安装过程中最好使用root用户。

1.2.2 Windows下安装

不需要安装,有一个msvc6存放包括源代码和用例在内的开发工程(for VC6 only),使用之前请先编译"log4cplus_dll class"工程生成dll,或者编译"log4cplus_static class"工程生成lib。

1.3 使用前配置

1.3.1 Linux下的配置

确保你的Makefile中包含/usr/local/lib/liblog4cplus.a(静态库)或-llog4cplus(动态库)即可,头文件在/usr/local/include/log4cplus目录下。对于动态库而言,想要正常使用,还得将库安装路径加入到LD_LIBRARY_PATH中,一般可以这样做:以root身份登录,在/etc/ld.so.conf中加入安装路径,这里是/usr/local/lib,然后执行/sbin/ldconfig使设置生效即可。

1.3.2 Windows下的配置

将"log4cplus_dll class"工程或"log4cplus_static class"工程的dsp 文件插入到你的工程中,或者直接把两个工程编译生成的库以及头文件所在目录放到你的工程的搜索路径中,如果你使用静态库,请在你的工程中"project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。

1.4LOG4CPLUS构成要素简介

Layouts :布局器,控制输出消息的格式。
Appenders :挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端(如屏幕,文件等等)。
Logger :记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。
Categories :分类器,层次化(hierarchy)的结构,用于对被记录信息的分类,层次中每一个节点维护一个logger的所有信息。
Priorities :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。

1.5 基本使用步骤

1. 实例化一个appender对象。
2. 实例化一个layout对象。
3. 将layout对象绑定(attach)到appender对象。
4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance(“logger_name”)。
5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger。
6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录。

1.6 三种控制输出格式的布局管理器

log4cplus通过布局器(Layouts)来控制输出的格式,log4cplus提供了三种类型的Layouts,分别是SimpleLayout、PatternLayout、和TTCCLayout。

1.6.1 SimpleLayout

是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-",这里略。

1.6.2 PatternLayout

是一种有词法分析功能的模式布局器,一提起模式就会想起正则表达式,这里的模式和正则表达式类似,但是远比后者简单,能够对预定义的标识符(称为conversion specifiers)进行解析,转换成特定格式输出。通过填写特定格式的模式字符串"pattern",原始信息被包含到一堆有格式的信息当中,这就使得用户可以根据自身需要来定制显示内容。"pattern"可以包含普通字符串和预定义的标识符,其中:
(1)普通字符串,能够被直接显示的信息。
(2)预定义标识符,通过"%"与一个或多个字符共同构成预定义的标识符,能够产生出特定格式信息。

关于预定义标识符,log4cplus文档中提供了详细的格式说明,根据不同的pattern,各种消息格式使
用情况列举如下:
(1)"%%",转义为%, 即,std::string pattern = "%%" 时输出: "%"
(2)"%c",输出logger名称,比如std::string pattern ="%c" 时输出: "test_logger.subtest",也可以控制logger名称的显示层次,比如"%c{1}"时输出"test_logger",其中数字表示层次。
(3)"%D",显示本地时间,当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45",%d显示标准时间,所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" (因为我们是东8区,差8个小时啊)。可以通过%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",输出当前记录器所在的文件名称,比如std::string pattern ="%F" 时输出: "main.cpp"
(5)"%L",输出当前记录器所在的文件行号,比如std::string pattern ="%L" 时输出: "51"
(6)"%l",输出当前记录器所在的文件名称和行号,比如std::string pattern ="%L" 时输出: "main.cpp:51"
(7)"%m",输出原始信息,比如std::string pattern ="%m" 时输出: "teststr",即上述代码中 LOG4CPLUS_DEBUG的第二个参数,这种实现机制可以确保原始信息被嵌入到带格式的信息中。
(8)"%n",换行符,没什么好解释的
(9)"%p",输出LogLevel,比如std::string pattern ="%p" 时输出: "DEBUG"
(10)"%t",输出记录器所在的线程ID,比如std::string pattern ="%t" 时输出: "1075298944"
(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。
(12)格式对齐,比如std::string pattern ="-10m"时表示左对齐,宽度是10,此时会输出"teststr ",当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等

1.6.3 TTCCLayout

是在PatternLayout基础上发展的一种缺省的带格式输出的布局器, 其格式由时间,线程ID,Logger和NDC 组成(consists of time, thread, Logger and nested diagnostic context information, hence the name),因而得名。提供给那些想显示典型的信息(一般情况下够用了)又懒得配置pattern的同志们。

TTCCLayout在构造时有机会选择显示本地时间或GMT时间,缺省是按照本地时间显示:
TTCCLayout::TTCCLayout(bool use_gmtime = false)。

1.7 如何将LOG记录到文件

log4cplus在将log信息记录到文件的基础上,提供了更多的功能,可以按照你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,依次类推;或者按照日期来决定是否转储。 log4cplus提供了三个类用于文件操作,它们是FileAppender类、RollingFileAppender类、DailyRollingFileAppender类。

1.7.1 FileAppender类

实现了基本的文件操作功能,构造函数如下: FileAppender(const log4cplus::tstring& filename, LOG4CPLUS_OPEN_MODE_TYPE mode =LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc, bool immediateFlush = true);
filename : 文件名
mode : 文件类型,
可选择的文件类型包括app、ate、binary、in、out、trunc,因为实际上只是对stl的一个简单包装。缺省是trunc,表示将先前文件删除。 immediateFlush :缓冲刷新标志,如果true
表示每向文件写一条记录就刷新一次缓存,否则直到FileAppender被关闭或文件缓存已满才更新文件,一般是要设置true的,比如你往文件写的过程中出现了错误(如程序非正常退出),即使文件没有正常关闭也可以保证程序终止时刻之前的所有记录都会被正常保存。 FileAppender类的使用情况将在针对脚本配置这块来讲,另外两个类也是如此(特此说明)。

1.7.2 RollingFileAppender类

构造函数如下: log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring& filename, long maxFileSize, int maxBackupIndex, bool immediateFlush)
filename : 文件名
maxFileSize : 文件的最大尺寸
maxBackupIndex : 最大记录文件数
immediateFlush : 缓冲刷新标志
RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1,然后继续记录。

1.7.3 DailyRollingFileAppender类

构造函数如下:
DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring& filename, DailyRollingFileSchedule schedule, bool immediateFlush, int maxBackupIndex)
filename : 文件名
schedule : 存储频度
immediateFlush : 缓冲刷新标志
maxBackupIndex : 最大记录文件数
DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,
这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分),maxBackupIndex的含义同上所述。

1.8 日志输出优先级控制

log4cplus将输出的log信息按照LogLevel(从低到高)分为:
NOT_SET_LOG_LEVEL (-1) :接受缺省的LogLevel,如果有父logger则继承它的LogLevel;
ALL_LOG_LEVEL ( 0) :开放所有log信息输出;
TRACE_LOG_LEVEL ( 0) :开放trace信息输出(即ALL_LOG_LEVEL);
DEBUG_LOG_LEVEL (10000) :开放debug信息输出;
INFO_LOG_LEVEL (20000) :开放info信息输出;
WARN_LOG_LEVEL (30000) :开放warning信息输出;
ERROR_LOG_LEVEL (40000) :开放error信息输出;
FATAL_LOG_LEVEL (50000) :开放fatal信息输出;
OFF_LOG_LEVEL (60000) :关闭所有log信息输出。 可以通过

logger_name.setLogLevel(LogLevel)来设置日志输出的优先级。

1.9 基于脚本配置来过滤log信息

除了通过程序实现对log环境的配置之外,log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能。通过脚本可以完成对logger、appender和layout的配置,因此可以解决怎样输出,输出到哪里的问题。

1.9.1 Appender的配置语法:
(1)设置名称:

/*设置方法*/

log4cplus.appender.appenderName=fully.qualified.name.of.appender.class

例如(列举了所有可能的Appender,其中SocketAppender后面会讲到):

log4cplus.appender.append_1=log4cplus::ConsoleAppender

log4cplus.appender.append_2=log4cplus::FileAppender

log4cplus.appender.append_3=log4cplus::RollingFileAppender

log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender

log4cplus.appender.append_4=log4cplus::SocketAppender

(2)设置Filter:

包括选择过滤器和设置过滤条件,可选择的过滤器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:

对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch(true|false), 只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true
时才会匹配。LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为
true时才会匹配。对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值与StringToMatch对应的LogLevel值与相同, 且AcceptOnMatch为true时会匹配。过滤条件处理机制类似于IPTABLE的Responsibility chain,(即先deny、再allow)不过执行顺序刚好相反,后写的条件会被先执行,比如: log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.append_1.filters.1.AcceptOnMatch=true
#log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter
会首先执行filters.2的过滤条件,关闭所有过滤器,然后执行filters.1,仅匹配TRACE信息。

(3)设置Layout

可以选择不设置、TTCCLayout、或PatternLayout 如果不设置,会输出简单格式的log信息。
设置TTCCLayout如下所示:
log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
设置PatternLayout如下所示:
log4cplus.appender.append_1.layout=log4cplus::PatternLayout
log4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n

1.9.2 logger的配置语法

包括rootLogger和non-root logger。
对于rootLogger来说: log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...
对于non-root logger来说: log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...
脚本方式使用起来非常简单,只要首先加载配置即可(urconfig.properties是自行定义的配置文件):PropertyConfigurator::doConfigure("urconfig.properties");

1.10 例子

#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
#include <string>
#include <memory>
using namespace log4cplus;
using namespace log4cplus::helpers;

/*log4cplus 使用步骤:
*1. 实例化一个appender对象。
*2. 实例化一个layout对象。
*3. 将layout对象绑定(attach)到appender对象。
*4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance(“logger_name”)。
*5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger。
*6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录。
*/
int main()
{
    //步骤1. 实例化一个appender对象。
    //FileAppender(const log4cplus::tstring& filename,                     
    //             LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,
    //             bool immediateFlush = true);                     
    //filename       : 文件名
    //mode           : 文件类型,可选择的文件类型包括app、ate、binary、in、out、trunc标志,缺省是trunc,表示将先前文件删除。
    //immediateFlush :缓冲刷新标志,如果为true表示每向文件写一条记录就刷新一次缓存,否则直到FileAppender
    //                 被关闭或文件缓存已满才更新文件,一般是要设置true的,比如你往文件写的过程中出了错误(如程序非正常退出),
    //                 即使文件没有正常关闭也可以保证程序终止时刻之前的所有记录都会被正常保存。
    // 定义一个文件Appender
    SharedAppenderPtr pFileAppender(new FileAppender(("testlog.log")));
    
    //log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring& filename,                           
    //                                                                      long maxFileSize,
    //                                                                      int maxBackupIndex,
    //                                                                      bool immediateFlush)
    //filename       : 文件名
    //maxFileSize    : 文件的最大尺寸
    //maxBackupIndex : 最大记录文件数
    //immediateFlush : 缓冲刷新标志
   //RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,
   //除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),
   //当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1。然后继续记录
   //SharedAppenderPtr  pFileAppender(new RollingFileAppender("testlog.log", 5*1024, 5));   
    
 
   //DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring& filename,
   //                                                     DailyRollingFileSchedule schedule,
   //                                                     bool immediateFlush,
   //                                                     int maxBackupIndex)
   //DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中
   //,这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)。
   //maxBackupIndex的含义同上,
   //下面代码运行后会以分钟为单位,分别生成名为Test.log.2004-10-17-03-03、
   //Test.log.2004-10-17-03-04和Test.log.2004-10-17-03-05这样的文件;如果超过了就另存。
   //SharedAppenderPtr pFileAppender(new DailyRollingFileAppender("test.log", MINUTELY, true, 5));
   
   
   pFileAppender->setName("LoggerName");
    
   
    //步骤2. 实例化一个layout对象。
    //"%%",转义为%, 即,std::string pattern = "%%" 时输出: "%"
    //"%c",输出logger名称,比如std::string pattern ="%c" 时输出: "test_logger.subtest",
    //       也可以控制logger名称的显示层次,比如"%c{1}"时输出"test_logger",其中数字表示层次
    //
    //"%D",显示本地时间,当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45",
    //      %d显示标准时间,所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" (因为我们是东8区,差8个小时啊)。   
    //      可以通过%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
    //
    //"%F",输出当前记录器所在的文件名称
    //"%L",输出当前记录器所在的文件行号"
    //"%l",输出当前记录器所在的文件名称和行号
    //"%m",输出原始信息,以确保原始信息被嵌入到带格式的信息中。
    //"%n",换行符,没什么好解释的
    //"%p",输出LogLevel,比如std::string pattern ="%p" 时输出:"DEBUG"ï
    //"%t",输出记录器所在的线程ID,比如std::string pattern ="%t" 时输出: "1075298944"
    //"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,
    //       NDC可以用对不同源的log信息(同时地)交叉输出进行区分,关于NDC方面的详细介绍会在下文中提到。
    //格式对齐,比如std::string pattern ="%-10m"时表示左对齐,宽度是10,此时会输出"teststr   ",
    //当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等
    std::auto_ptr<Layout> pPatternLayout(new PatternLayout(("%p:%D  -%m [%l - %t]%n")));

//步骤3. 将layout对象绑定(attach)到appender对象。
    pFileAppender->setLayout(pPatternLayout);
      
    //步骤4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance(“logger_name”)。
    // 定义Logger
    Logger pTestLogger = Logger::getInstance(("LoggerName"));

//步骤5. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger。
    // 将需要关联Logger的Appender添加到Logger上
    pTestLogger.addAppender(pFileAppender);     
        
    // 输出日志信息
    //LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message");
    //LOG4CPLUS_DEBUG(pTestLogger, "This is a <Warn> log message");

//步骤6. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录。
    pTestLogger.setLogLevel(TRACE_LOG_LEVEL);

LOG4CPLUS_TRACE(pTestLogger, "printMessages()");
    LOG4CPLUS_DEBUG(pTestLogger, "This is a DEBUG message");
    LOG4CPLUS_INFO(pTestLogger, "This is a INFO message");
    LOG4CPLUS_WARN(pTestLogger, "This is a WARN message");
    LOG4CPLUS_ERROR(pTestLogger, "This is a ERROR message");
    LOG4CPLUS_FATAL(pTestLogger, "This is a FATAL message");

return 1;
}

 编译执行

编译

g++ log.cpp -I /usr/local/log4cplus/include/ -L /usr/local/log4cplus/lib -l log4cplus -o log

补充

1.编译时提示

此时在代码中添加头文件:#include <log4cplus/loggingmacros.h>

2.提示:error while loading shared libraries: liblog4cplus-1.1.so.9: cannot open shared object file: No such file or directory

  find / -name liblog4cplus-1.1.so.9/*我的找到在/usr/local/lib/liblog4cplus-1.1.so.9*/

  cd /etc
  sudo gedit ld.so.conf   (添加 /usr/local/lib/)
  sudo ldconfig

Log4cplus使用的更多相关文章

  1. 当年只会C# 所以写C++就成这样了! log4cplus -> log4net

    属实C++不会. 目前帮朋友弄个小项目需要小折腾一下. c# 一直采用 log4net ,c++的呢,找找有个log4cplus  知识有限,做个通用类吧.别把精力放在这里. 动手创建个静态类. 为了 ...

  2. log4cplus 直接创建logger 对象

    #include <log4cplus/loggingmacros.h> #include <log4cplus/fileappender.h> #include <lo ...

  3. log4cplus 在配置文件中设置文件路径,程序自动创建目录,且在日志文件前按日期创建相应的目录

    #include <string> #include <cstdio> #include <log4cplus/logger.h> #include <log ...

  4. 【原】log4cplus使用说明

    网上关于开源日志工具log4cplus的说明有很多,但大多略显复杂,本文主要从实用的角度,介绍一种最简单而且又实用的方法.本文的方法已经足够满足实际工程中的使用需求,而且不需要很复杂的流程,可以实现. ...

  5. Log4Cplus的介绍

    Log4Cplus是一款很好的开源日志打印程序,该日志打印程序的配置文件为类似INI的文件,以下为该日志打印程序配置文件中的说明: 1.#—注释行的开头表示,即以该字符开头的行,改日志程序不解释改行内 ...

  6. 说说log4cplus

    <C++ primer 第五版>已经翻了一段时间了,每天早上的班车上看一个小时.书是好书,可惜很多知识还是停留在表面上.每天除了翻书,一是也找到不合适的方法进一步深入,晚上看到新闻联播的老 ...

  7. log4cplus配置文件使用

    简介 log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库.它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到 ...

  8. 开源日志库log4cplus+VS2008使用

    一.简介     log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库.   二.下载     可从网站[url]http://log ...

  9. 使用最新的log4cplus(1.1.1)隔离不同的 log 文件输出

    部分参考了博客. http://www.cppblog.com/tx7do/articles/11719.html 基于脚本配置来过滤log信息 除了通过程序实现对log环境的配置之外,log4cpl ...

随机推荐

  1. Javascript 学习之路:鼠标长按事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 【POI word】使用POI实现对Word的读取以及生成

    项目结构如下: 那第一部分:先是读取Word文档 package com.it.WordTest; import java.io.FileInputStream; import java.io.Fil ...

  3. MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

    主服务器上(注:应该是允许从机访问)  GRANT REPLICATION SLAVE ON *.* to ‘rep1’@’192.168.10.131’ identified by ‘passwor ...

  4. js高级技巧之高级定时器

    实际上,浏览器负责进行排序,指派某段代码在某个时间点运行的优先级. 可以吧js想象成在时间线上运行的. JavaScript中没有任何代码是立刻执行的,但一旦进程空闲则尽快执行. 1.重复的定时器: ...

  5. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  6. ASCIL码和字符的转换

    1.在python中: 字符-->ASCIL 用ord函数 ASCIL-->字符 用chr函数 下面是一个输入小写字母转换为大写字母输出的例子: # -*- coding: utf-8 - ...

  7. 解决js(ajax)提交后端的“ _xsrf' argument missing from POST” 的错误

    首先先简述一下CSRF: CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST ...

  8. DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots

    题目传送门 /* DFS:每个点四处寻找,判断是否与前面的颜色相同,当走到已走过的表示成一个环 */ #include <cstdio> #include <iostream> ...

  9. Android Force Close的原因:

    1.程序空指针: 2.程序加载的资源找不到: 3.未加载布局文件时直接使用了对象: 4.后台service挂掉导致不可捕捉的ANR或crash: 5.Activity未在配置文件中注册.

  10. Backbone.js学习之一

    昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以 ...