C++使用Log4Cpp日志库

需求:我们项目中需要一个本地的日志记录,且保存日志需要半年的时间。

引入:下载 log4cplus-1.2.1 源码,默认是带有 msvc10工程的,编译源码可以生产  log4cplusUD.dll log4cplusU.dll等文件。不赘述关于编译的过程

使用:在Windows Qt环境下使用

Pro文件设置:

INCLUDEPATH +=  $$PWD/thirdparty
DEPENDPATH  +=  $$PWD/thirdparty

win32:{
    CONFIG(debug, debug|release):{
        LIBS +=-L$$PWD/thirdparty -llog4cplusUD
    }else:CONFIG(release, debug|release):{
        LIBS +=-L$$PWD/thirdparty -llog4cplusU
    }

log4cpp配置文件:

其中使用的appender: RollingFileAppender、DailyRollingFileAppender、TimeBasedRollingFileAppender

其中每种appender都有支持的参数,而且这些参数也不是通用的,只有在指定的appender模式下才有效,有时经常弄错。

分享一种了解参数的方式(千万别网上搜,因为千千万都是没细了解过得),可以直接打开源码搜索指定的appender名称

举例说明:DailyRollingFileAppender

 

 具体我自己使用的配置如下:

#日志级别定义:TRACE(跟踪)、DEBUG(调试)、INFO(通知)、WARN(警告)、ERROR(错误)、FATAL(致命错误)
#日志文件转储频率:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、DAILY(每天)、HOURLY(每时)、MINUTELY(每分)

#----------Category:指定的log优先级是TRACE,其Appender为MML_ALL_MSGS,也可以定义多个Appender
log4cplus.logger.VisheeMmlLoggerInstance=TRACE,MML_ALL_MSGS

#----------Appender:指定输出源属性
#所有消息(TRACE) 按日期回卷文件,即日期分割策略、文件到达某个大小的时候产生一个新的文件
#log4cplus.appender.MML_ALL_MSGS=log4cplus::RollingFileAppender

#(DailyRollingFileAppender有效)设置日志转储的频率 
#注意:DailyRollingFileAppender模式下需要正常关闭程序才能分割,如果没有释放日志对象,会一直往一个日志文件中输出,且不会按转储频率分割
#log4cplus.appender.MML_ALL_MSGS.Schedule=HOURLY

#(RollingFileAppender有效)设置生成日志最大大小,默认10MB
#log4cplus.appender.MML_ALL_MSGS.MaxFileSize=10MB

#设置生成日志最大个数
#log4cplus.appender.MML_ALL_MSGS.MaxBackupIndex=5
#log4cplus.appender.MML_ALL_MSGS.File=./logs/MML_LIB_TRACE.log

#所有消息(TRACE) 按照时间日期来写文件
log4cplus.appender.MML_ALL_MSGS=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.MML_ALL_MSGS.FilenamePattern=./logs/MML_LIB_TRACE.%d{yyyy-MM-dd}.log
log4cplus.appender.MML_ALL_MSGS.MaxHistory=180
log4cplus.appender.MML_ALL_MSGS.Schedule=DAILY
log4cplus.appender.MML_ALL_MSGS.RollOnClose=false

#----------Loyout设置日志打印格式,PatternLayout表示可以灵活指定布局模式
log4cplus.appender.MML_ALL_MSGS.layout=log4cplus::PatternLayout
log4cplus.appender.MML_ALL_MSGS.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S.%Q} %t %-5p] - [%l] %m %n

#----------Filter选择过滤器设置
log4cplus.appender.MML_ALL_MSGS.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.MML_ALL_MSGS.filters.1.LogLevelMin=TRACE
log4cplus.appender.MML_ALL_MSGS.filters.1.LogLevelMax=FATAL
log4cplus.appender.MML_ALL_MSGS.filters.1.AcceptOnMatch=true
#首先执行filters.2的过滤条件,关闭所有过滤器,然后执行filters.1
log4cplus.appender.MML_ALL_MSGS.filters.2=log4cplus::spi::DenyAllFilter

 

封装使用类VisheeLogger.h:

/********************************************************************
 *      created:      2018/03/22  16:26:13
 *      author :      chenshi
 *      contact:      chenshi@vishee.com
 *
 *      description: log4cplus 日志库应用封装
 *******************************************************************/

#ifndef VISHEELOGGER_H
#define VISHEELOGGER_H

#include "log4cplus/logger.h"
#include "log4cplus/configurator.h"
#include "log4cplus/loggingmacros.h"

using namespace log4cplus;

class VisheeLogger
{
public:
    VisheeLogger();
    ~VisheeLogger();

    /**   @brief         :  单例函数
     *     @return       :  其他=成功 NULL=错误
     */
    static VisheeLogger* instance();

public:
    /**   @brief         :  获取日志实体
     *     @return       :  日志实体
     */
    const Logger& GetLogger()
    {
        return m_logger;
    }

protected:
    /**   @brief         :  初始化日志功能
     *     @return       :  true=成功 false=错误
     */
    bool initialize();

    /**   @brief         :  反初始化日志功能
     *     @return       :  true=成功 false=错误
     */
    bool uninitialize();

private:
    static VisheeLogger* m_spInstance;  // 日志类单例实体

    Logger m_logger; // 日志实体
    const log4cplus::tstring m_sLoggerName;  // 日志实体的名称
    const log4cplus::tstring m_sLoggerConfig; // 日志配置文件的路径
};

//函数追踪宏
#define VISHEE_TRACE_METHOD()  \
            LOG4CPLUS_TRACE_METHOD ( VisheeLogger::instance()->GetLogger(), \
            LOG4CPLUS_TEXT(LOG4CPLUS_MACRO_FUNCTION()))

/**   @brief         :  日志写入宏
 *
 *     LogLevel = { TRACE_LOG_LEVEL, DEBUG_LOG_LEVEL,
 *                          INFO_LOG_LEVEL, WARN_LOG_LEVEL,
 *                          ERROR_LOG_LEVEL, FATAL_LOG_LEVEL }
 *
 *     @param[in]  :  LogLevel logLevel      写入日志等级
 *     @param[in]  :  const char* logEvent  写入日志内容
 *     @return       :  空
 */
#define VISHEE_LOG(logLevel, logEvent)                                \
            LOG4CPLUS_MACRO_BODY (VisheeLogger::instance()->GetLogger(), logEvent, logLevel)

///**   @brief         :  字符格式化
// *     @param[in]  :  fmt 参考sprintf的格式
// *     @param[in]  :  ... 根据格式输入参数
// *     @return       :  字符=成功 空=错误
// */
//QString g_FormatBuffer(const char *fmt, ...);

#endif // VISHEELOGGER_H

VisheeLogger.cpp

/********************************************************************
 *      created:      2018/03/22  16:26:13
 *      author :      chenshi
 *      contact:      chenshi@vishee.com
 *
 *      description: log4cplus 日志库应用封装
 *******************************************************************/

#include "VisheeLogger.h"
#include <QFile>
#include <QDir>
#include <QDebug>

// 单例实体初始化
VisheeLogger* VisheeLogger::m_spInstance = NULL;

VisheeLogger::VisheeLogger()
    : m_sLoggerName( LOG4CPLUS_TEXT("VisheeMmlLoggerInstance") )
    , m_sLoggerConfig( LOG4CPLUS_TEXT("./config/MzrmyyMedisignLib.log") )
{
    initialize();
}

VisheeLogger::~VisheeLogger()
{
    uninitialize();
}

/**   @brief         :  单例函数
 *     @return       :  NULL=错误 其他=成功
 */
VisheeLogger* VisheeLogger::instance()
{
    if ( NULL == m_spInstance )
    {
        m_spInstance = new VisheeLogger;
    }

    return m_spInstance;
}

/**   @brief         :  初始化日志功能
 *     @return       :  true=成功 false=错误
 */
bool VisheeLogger::initialize()
{
    // 判断日志实体是否已经创建
    if ( !Logger::exists( m_sLoggerName ) )
    {
        // 加载日志功能配置文件
        PropertyConfigurator::doConfigure( m_sLoggerConfig );
//        if ( Logger::getRoot().getAllAppenders().empty() )
//        {
//            // 加载配置文件失败
//            qDebug() << "加载日志配置文件失败";
//            return false;
//        }

        // 创建日志实体
        m_logger = Logger::/*getRoot().*/getInstance( m_sLoggerName );

        //LOG 日志功能正常启动...
        LOG4CPLUS_INFO( m_logger, "--------------------------------------程序初始化日志功能启动.dll版本:V1.1.0.211129--------------------------------------" );
        return true;
    }

    return false;
}

/**   @brief         :  反初始化日志功能
 *     @return       :  true=成功 false=错误
 */
bool VisheeLogger::uninitialize()
{
    // 判断日志实体是否存在
    if ( Logger::exists( m_sLoggerName ) )
    {
        // 终止日志实体
        m_logger.shutdown();
        return true;
    }

    return false;
}

///**   @brief         :  字符格式化
// *     @param[in]  :  fmt 参考sprintf的格式
// *     @param[in]  :  ... 根据格式输入参数
// *     @return       :  字符=成功 空=错误
// */
//QString g_FormatBuffer(const char *fmt, ...)
//{
//    char buffer[1024] = {0};
//    va_list ap;
//    va_start(ap, fmt);
//    int size = vsprintf (buffer, fmt, ap);
//    va_end(ap);
//    return QString::fromLocal8Bit(buffer, size);
//}

 

一般调用方式:

// 函数从开始到结束追踪
    VISHEE_TRACE_METHOD();

    // 写入日志
    VISHEE_LOG(INFO_LOG_LEVEL, QString("path:%1").arg(fullPath).toLocal8Bit().data());
    VISHEE_LOG(INFO_LOG_LEVEL, QString("request:%1").arg(request).toLocal8Bit().data());

  

更高级功能,例如C/S模式,或者自定义appender之类的自己研究吧,我也还没需求去用。

引用的带上原文地址哈,谢谢。

posted @ 2021-11-30 13:44  果园2018  阅读(1177)  评论(1编辑  收藏  举报