需求:我們項目中需要一個本地的日志記錄,且保存日志需要半年的時間。
引入:下載 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之類的自己研究吧,我也還沒需求去用。
引用的帶上原文地址哈,謝謝。
