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之類的自己研究吧,我也還沒需求去用。

引用的帶上原文地址哈,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM