您的位置:首页 > 其它

Log4cplus配置文件的使用(学习笔记)

2018-01-18 17:50 501 查看
对像我这样的小白来讲,大段的理论和解释风格比较精简的实例学习起来很难入门。一个简单并且解释很详细的例子反而更容易上手。
通过阅读几篇博客,自己找了一个小例子,并对其做了详细解释:
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信息,而在线上环境中,则只需
4000
要输出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 <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: " << "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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐