1. 程式人生 > 其它 >關於Log4Ccpp的引入使用,不是基礎介紹,是專案中使用的方式

關於Log4Ccpp的引入使用,不是基礎介紹,是專案中使用的方式

需求:我們專案中需要一個本地的日誌記錄,且儲存日誌需要半年的時間。

引入:下載log4cplus-1.2.1 原始碼,預設是帶有msvc10工程的,編譯原始碼可以生產log4cplusUD.dlllog4cplusU.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:      [email protected]
 *
 *      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:      [email protected]
 *
 *      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之類的自己研究吧,我也還沒需求去用。

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