1、涉及内容
- qt第三方开源库log4qt使用;
- 使用回调函数处理软件日志输出。
log4qt库下载地址:https://gitee.com/jiangtao008/log4qt
可参考文章:https://blog.csdn.net/weixin_42887343/article/details/110390546
2、设计思路
在Qt软件开发过程当中,我们经常会使用qDebug输出来调试信息;但是到了正式发布的时候,我们还需要日志输出为日志文件,实时保存日志信息。
这里我们采用qInstallMsgHandler
函数去自定义一个日志消息处理函数,函数原型为:
QtMsgHandler qInstallMsgHandler(QtMsgHandler);
QtMsgHandler
函数指针原型为:
typedef void( * QtMsgHandler)(QtMsgType, const char *);
3、代码:
LogMannage
为日志管理类,该类使用单例模式中的饿汉模式创建;所有日志通过msgOut
接口函数传入,然后写入日志文件。
#include "log4qt/log4qt.h"
#include "log4qt/logger.h"
#include "log4qt/propertyconfigurator.h"
#include "log4qt/ttcclayout.h"
#include "log4qt/consoleappender.h"
#include "log4qt/rollingfileappender.h"
#include "log4qt/dailyrollingfileappender.h"
#include "log4qt/patternlayout.h"
class LogMannage
{
public:
static LogMannage* instance()
{
return myLog;
}
void msgOut(QtMsgType type, const char *msg)
{
//=========== 日志文件输出控制(自带时间和等级) ===========
if(type == QtDebugMsg)
log->debug(msg);
else if(type == QtWarningMsg)
log->warn(msg);
else if(type == QtCriticalMsg)
log->error(msg);
else if(type == QtFatalMsg)
log->fatal(msg);
else
log->info(msg);
}
private:
static LogMannage *myLog;
Log4Qt::Logger *log; //日志指针
LogMannage()
{
//log初始化
log = Log4Qt::Logger::rootLogger(); //创建根log
QString ConfigPath = "/usr/local/app/data/config/log4qt.conf"; //设置配置文件路径
if(QFile::exists(ConfigPath))
{
Log4Qt::PropertyConfigurator::configure(ConfigPath); //配置
log->info("Load log4qt.conf file path:" + ConfigPath);
}
else
{
SetupLog4QtConfig("/usr/local/app/log/DC_202.log");
log->info("No find log4qt.conf file and use default config");
}
log->info("||==============================================================================================================||");
log->info("||---------------##########--------------#########-------------#########------------#############---------------||");
log->info("||---------------##--------##-----------##-------##-----------##-------##----------------##---------------------||");
log->info("||---------------##########-------------##-------##-----------##-------##----------------##---------------------||");
log->info("||---------------##--------##-----------##-------##-----------##-------##----------------##---------------------||");
log->info("||---------------##########--------------#########-------------#########-----------------##---------------------||");
log->info("||==============================================================================================================||");
}
~LogMannage()
{
}
void SetupLog4QtConfig(QString log_path)
{
// Create a layout
Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();
layout->setName("My Layout");
layout->setDateFormat("dd-MM-yyyy hh:mm:ss.zzz");
layout->activateOptions();
// Create a console appender
Log4Qt::ConsoleAppender *consoleAppender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);
consoleAppender->setName("My console Appender");
consoleAppender->activateOptions();
consoleAppender->setThreshold(Log4Qt::Level::DEBUG_INT);
log->addAppender(consoleAppender);
//Create a rolling file appender
Log4Qt::RollingFileAppender *rollingFileAppender = new Log4Qt::RollingFileAppender(layout, log_path, true);
rollingFileAppender->setName("My rolling file appender");
rollingFileAppender->setMaximumFileSize(20 * 1024 * 1024); //设置文件最大内存为 20 MB(20 * 1024 * 1024).
rollingFileAppender->setAppendFile(true); //设置文件为追加形式
rollingFileAppender->setThreshold(Log4Qt::Level::DEBUG_INT); //设置子输出等级过滤
rollingFileAppender->activateOptions();
log->addAppender(rollingFileAppender);
log->setLevel(Log4Qt::Level::ALL_INT); //设置根logger允许所以等级的消息被输出(子输出过滤是在根输出过滤的基础上)
//Log4Qt::LogManager::setHandleQtMessages(true);//设置监听qt自带的log输出
}
};LogMannage *LogMannage::myLog = new LogMannage();
void MessageHandler(QtMsgType type, const char *msg)
{
LogMannage::instance()->msgOut(type,msg);
}
int main(int argc, char *argv[])
{
qInstallMsgHandler(MessageHandler); //设置日志输出系统(回调函数)
qDebug()<<"this is a test log";
}