qt日志系统设计

1、涉及内容
  1. qt第三方开源库log4qt使用;
  2. 使用回调函数处理软件日志输出。

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";
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值