对像我这样的小白来讲,大段的理论和解释风格比较精简的实例学习起来很难入门。一个简单并且解释很详细的例子反而更容易上手。
通过阅读几篇博客,自己找了一个小例子,并对其做了详细解释:
1properties文件
1.1文件部分
文件:log.properties
log4cplus.rootLogger=ERROR, R
注释(1)
log4cplus.appender.R=log4cplus::DailyRollingFileAppender
注释(2)
log4cplus.appender.R.File=./log/error.log
注释(3)
log4cplus.appender.R.Schedule=HOURLY
注释(4)
log4cplus.appender.R.Append=true
注释(5)
log4cplus.appender.R.layout=log4cplus::PatternLayout
注释(7)
log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S,%Q}] [%t] %-5p - %m%n[%p]
注释(7)
log4cplus.logger.test=TRACE, RR
注释(1)
log4cplus.appender.RR=log4cplus::DailyRollingFileAppender
log4cplus.appender.RR.File=./log/test.log
log4cplus.appender.RR.MaxBackupIndex=192 #8 * 24
注释(6)
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
1.2 注释部分
(1)配置Logger对象
RootLogger配置格式:log4cplus.rootLogger= [LogLevel],appenderName,appenderName,…..,如此处LogLevel为ERROR,appenderName为R。
appenderName格式:log4cplus.logger.logger_name= [LogLevel|INHERITED],appenderName,…..
Logger对象:在log4cplus中logger对象具有层次结构,所有logger都通过一个层次化的结构来组织的,有一个Root级别的logger,用户可以定义自己的logger对象如test,也可以定义其子对象如test.subtest。
优先级(LogLevel):
log4cplus优先级由低到高:
NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
ALL_LOG_LEVEL :开放所有log信息输出
TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL :开放debug信息输出
INFO_LOG_LEVEL :开放info信息输出
WARN_LOG_LEVEL :开放warning信息输出
ERROR_LOG_LEVEL :开放error信息输出
FATAL_LOG_LEVEL :开放fatal信息输出
OFF_LOG_LEVEL :关闭所有log信息输出
在配置文件中,logger名称之后的第一个参数可以控制日志输出级别,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。具体级别与上文优先级对应:•TRACE •DEBUG •INFO •WARN •ERROR •FATAL
上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。
(2)appender配置,此处配置的是appender输出位置。Appender输出位置类型有:控制台输出(ConsoleAppender),文件输出(FileAppender / RollingFileAppender / DailyRollingFileAppender )。
此处使用的DailyRollingFileAppender根据频度来决定是否转储的文件转储方式,具体参数请参考《Log4cplus使用指南》P20。文末附此书下载链接。
(3)设置存储文件路径和名称
(4)设置存储频度,DailyRollingFileAppender 类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续 log 信息会另存到新文件中。此处设定的频度HOURLY是每小时。所有的频度类型包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)。
(5)缓冲刷新标识,如果为 true 表示每向文件写一条记录就刷新一次缓存,否则直到 FileAppender 被关闭或文件缓存已满才更新文件。一般要设置true,这样类似程序崩溃的情况发生后,程序终止时刻之前的所有记录都会被正常保存。
(6)设置最大记录文件数,当记录文件数超过MaxBackupIndex+1(此处为193)时,会删除最早生成的文件,保证整个文件数目等于MaxBackupIndex+1。后面的注释#8*24意在说明此处设置实质上是记录八天以内的日志。
(7)(8)layout是控制日志输出格式的,此处设置日志打印格式。格式包括三种类型:
SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-",若不设置格式则默认为该格式输出;TTCCLayout 其格式由时间,线程ID,Logger和NDC 组成; PatternLayout 是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。具体的格式信息请参考《Log4cplus使用指南》P15。
2 .cpp文件
test.cpp
#include
#include
#include
#include
#include
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: " << "rand integer: " << rand ());
// debug
LOG4CPLUS_DEBUG(logger, "this is debug log: " << "rand integer: "<< rand ());
// 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!!!!!!!!!");
//
Logger loggerTest = log4cplus::Logger::getInstance(_T("test"));
LOG4CPLUS_TRACE(loggerTest,"anther logger,trace");
LOG4CPLUS_ERROR(loggerTest,"anther logger,error ");
return 0;
}
3 遇到的问题
3.1 “LOG4CPLUS_WARN”: 找不到标识符 、 无法解析的外部符号(链接错误,很多文字)
解决方法记录在另一篇博客:http://blog.csdn.net/zhaojunwuiris/article/details/79064970
3.2 原例子CPP文件中并不是rand()函数,而是random(),使用时遇到问题,已修改例子。
3.3 原例子CPP文件中 Logger loggerTest = log4cplus::Logger::getInstance(_T("test"));为
Logger loggerTest = log4cplus::Logger::getInstance("test");
此处因为我的log4cplus库文件以及例子均使用的Unicode字符集,需将"test"转换为宽字符,已改动。至于为什么要改,如果想探究,可以参考这篇文章:file:///C:/Users/Administrator/Desktop/实现UNICODE和ANSII双编程的方法.mht
本文使用的例子来自博客:https://www.cnblogs.com/james1207/p/3328996.html
另附《Log4cplus使用指南》下载链接:
https://pan.baidu.com/s/1rajyw7E