關於Log4Ccpp的引入使用,不是基礎介紹,是專案中使用的方式
阿新 • • 發佈:2021-11-30
需求:我們專案中需要一個本地的日誌記錄,且儲存日誌需要半年的時間。
引入:下載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之類的自己研究吧,我也還沒需求去用。
引用的帶上原文地址哈,謝謝。