Qt之第三方库‌日志log使用(四)

Qt开发 系列文章 - log(四)


目录

前言

一、Qt开源库

二、LOG日志

QsLog

log4qt

qclog

总结

三、QsLog使用

1.QsLog下载

2.QsLog移植

3.修改项目文件.pro

4.使用技巧

1.添加头文件

2.使用方式

四、log4qt使用

1.log4qt下载

2.log4qt移植

3.修改项目文件.pro

4.二次封装函数

1.class类定义

2.构造/析构函数

3.用户定义函数

5.使用方法

1.添加二次封装文件

2.用户使用效果

总结


前言

Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用程序功能的控件集合。这些控件库可以提供额外的用户界面元素、功能组件或者优化现有Qt控件的性能和外观。一些常用的Qt第三方控件库有QCustomPlot、QXlsx、QHotkey、QtSerialPort、QsLog等等很多,它们都是开源的、免费的,且基于Qt框架编写,今天本文主要讲解Qt Log第三方控件开源库。

Qt Log日志是指在使用Qt框架进行软件开发时,通过Qt提供的日志系统记录下的程序运行时的信息、警告、错误等日志消息。这些日志消息对于调试程序、追踪程序执行流程、定位问题原因等方面具有重要意义。


一、Qt开源库

Qt开源库‌是指基于Qt框架的一系列开源库,这些库提供了丰富的功能,帮助开发者在Qt应用程序中实现各种功能需求。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛用于开发GUI程序,也可用于开发非GUI程序,如控制台工具和服务器。

常用的Qt第三方控件开源库及特点和用途简要描述如下:

  1. QsLog是一个轻量级的日志库,用于在Qt应用程序中记录和输出日志信息;

  2. ‌‌****QXlsx****是一个用于读写Microsoft Excel文件的库,使Qt应用程序能够处理Excel数据;

  3. ‌**QCustomPlot**‌是一个绘制图表、曲线、统计图等的库,具有灵活的定制化和丰富的功能;

  4. **QHotkey**是一个简单易用的库,用于在Qt应用程序中注册全局快捷键;

  5. **QtSerialPort**是Qt官方提供的库,用于串口通信,支持跨平台使用;

  6. ‌‌****QJson****‌是用于JSON数据解析和生成的库,方便处理JSON格式的数据;

  7. **QwtPlot3D**‌是绘制三维图形的库,支持曲面图、线框图、散点图等。

二、LOG日志

Qt Log日志的主要作用及重要性包括:

  1. 在程序的开发和测试阶段,日志可以帮助开发者快速定位和解决程序中的bug;
  2. 通过分析日志数据,可以了解程序的运行性能,包括响应时间、处理速度等;
  3. 在程序运行时,日志可以记录用户的操作行为,有助于后续的行为分析和用户习惯研究;
  4. 在程序发生崩溃或异常时,日志中的错误信息和堆栈跟踪可以帮助开发者快速定位问题原因;
  5. 重要性在于,它是连接程序运行时的内部状态和外部世界的桥梁,是开发者了解程序行为和状态的重要手段。

开发Log日志库的第三方软件很多,下面介绍3种较常见的开源且免费第三方log库(QsLog、log4qt、qclog)。

QsLog

QsLog简单小巧,它是一个基于Qt的轻量级开源日志库。按日志消息的重要性共设为六个级别,运行时可配置的日志级别阈值;支持多个目标,附带文件和调试目标,线程安全;支持现成的常见Qt类型的日志记录,直接把它放到你的项目中。下载地址:GitHub - QsLog

log4qt

log4qt是Apache的log4j的qt移植版本,log4j是在java下面使用的一个超强大的日志系统。log4qt是一些大牛参考log4j整理的一套在C++上使用的日志系统,使用参考log4j的使用。log4qt是开源的,有多个版本源码,功能有所相等,实现也各不相同,有一些配置选项并没有实现,需要自己修改源码,比如说设置输出等级,打印文件名、函数名、行号等信息。

官网下载地址:Log4Qt - Logging for C++/Qt download | SourceForge.net

qclog

qclog是基于Qt5/C++的日志库,可输出彩色日志,高效、快速、易用、好看。

总结

log4qt就相对复杂,功能也应该较多,这种方式之前有用过,感觉还可以;QsLog比较小巧方便、轻量级,还不错,推荐使用;qclog没有用过,但看了一下也比较小巧,有兴趣的人可以试一下。

下面主要讲解下,我使用过的log4qt和QsLog三方库,另一个大家可试一下。

三、QsLog使用

1.QsLog下载

打开上面的下载地址GitHub - QsLog,如下所示。在Code处点击Download ZIP,下载压缩文件;也可以使用git clone https://github.com/victronenergy/QsLog.git 将项目下载到本地。

下载完后,并解压该文件,如下所示。

打开该文件夹,可以看到里面有若干文件夹,主要时一些QsLog的使用例程,和github的配置文件,我们主要关心QsLog的源文件,在图中将QsLog源文件复制到你的Qt工程项目中,是此行的目的。

2.QsLog移植

新建一个名为QsLog的文件夹,将上图界面上的.c文件、.h文件和.pri文件复制到该文件夹里面,如下所示(左),将QsLog复制到项目路径下面,如下所示(右)。

3.修改项目文件.pro

打开你的Qt项目,点击打开你的pro文件,在其中添加如下配置信息,代码示例:

QXLSX_PARENTPATH=$$PWD/QsLog/
include($$PWD/QsLog/QsLog.pri)

这样QsLog文件夹就添加到你的Qt项目中了,如下图所示。

在打开QsLog.pri文件,可将这几行代码屏蔽。

至此,已经将QsLog在Qt中运用的开发环境已经搭建完毕,可以在Qt项目中使用QsLog生成日志文件了。下面在讲解一些QsLog的使用技巧,也可以参考下官方示例上的使用方式。

4.使用技巧

1.添加头文件

进行写入日志操作时,别忘了,在文件上方添加QsLog头文件,如下所示:

#include "QsLog.h"

2.使用方式

在UI界面上设置按钮,名称写入日志,点击可实现,创建一个log文件,开启日志记录,向其写入日志信息,示意图:

具体实方式参考如下代码:

//using namespace  QsLogging;
void MainWindow::on_pushButton_clicked()
{
    // 初始化日志记录机制
    QsLogging::Logger& logger = QsLogging::Logger::instance();
    // 设置日志级别为Trace
    logger.setLoggingLevel(QsLogging::TraceLevel);
    // 设置日志输出的位置
    QString logPath = QDir(QCoreApplication::applicationDirPath()).filePath("log.txt");
    //QString sLogPath(QCoreApplication::applicationDirPath() + "/log.txt");
    // 添加文件输出目标,并设置日志文件路径和分割策略
    QsLogging::DestinationPtr fileDestination(QsLogging::DestinationFactory::MakeFileDestination(
               logPath, //文件位置
               QsLogging::EnableLogRotation, //启用日志轮转 防止单个文件过大
               QsLogging::MaxSizeBytes(1024 * 1024), //单个文件的最大大小,并不是绝对地达到这个大小才会轮转,而是会保证每一条日志的完整性
               QsLogging::MaxOldLogCount(5) //保存地日志文件个数,保存最新的100个日志文件
               ));
    logger.addDestination(fileDestination);

    // 记录一些日志信息
    QLOG_TRACE() << "This is a trace message.";
    QLOG_DEBUG() << "This is a debug message.";
    QLOG_INFO()  << "This is an informational message.";
    QLOG_WARN()  << "This is a warning message.";
    QLOG_ERROR() << "This is an error message.";
    QLOG_FATAL() << "This is a fatal error, the application will exit.";
//改写封装为下面函数
//  logger.trace("This is a trace message.");
//  logger.debug("This is a debug message.");
//  logger.info("This is an informational message.");
//  logger.warn("This is a warning message.");
//  logger.error("This is an error message.");
//  logger.fatal("This is a fatal error, the application will exit.");
}

上述代码,编写完后,运行代码后,点击test后会在你的工程目录release下面生成log文件(如图②),打开如下③所示,就是你刚才添加的内容。

上述功能代码最好放在构造函数里面或者main函数里面使用,这样保证更方便的使用。

QsLog库里面还有许多功能,更为详细可参考官方给出的示例工程。

四、log4qt使用

1.log4qt下载

打开上面的下载地址Log4Qt - for C++/Qt download,如下所示。在Download处点击下载压缩文件,下载好的文件见本文末尾链接。

下载完后,并解压该文件,得到需要的log4qt文件,相应步骤同上一小节QsLog,可参考。

2.log4qt移植

创建一个Qt项目(不带ui设计),名称为logHand。将上述下载好的log4qt文件夹复制到logHand项目下面,如下所示。注意:本次使用/添加第三方库文件不同于以往的方式。

这次不带UI设计,主要目的是在log4qt库的基础上在进行二次封装、改写,更方便于使用,封装后类为logHand。

3.修改项目文件.pro

跟上一章Qt之第三方库‌QXlsx使用(三)-CSDN博客 和上一小节QsLog添加三方库文件有所不同的是,log4qt库子项目的pri文件已经将相应的源文件和头文件都已经添加到工程里面了,在主工程项目的pro文件里面,只需要添加如下配置信息,代码示例:

c 复制代码
#包含文件
include(../log4qt/log4qt.pri)

这样log4qt文件夹就添加到你的Qt项目中了,如下图所示。

4.二次封装函数

1.class类定义

封装后添加如下函数,在公共处,logHand类定义如下。

class LOGHANDSHARED_EXPORT LogHand
{

public:
    explicit LogHand();
    ~LogHand();

    static LogHand *getInstance();
    // 函数功能:    记录日志信息,日志等级:debug
    void debug(const QString &msg);
    // 函数功能:    记录日志信息,日志等级:info
    void info(const QString &msg);
    // 函数功能:    记录日志信息,日志等级:warn
    void warn(const QString &msg);
    // 函数功能:    记录日志信息,日志等级:error
    void error(const QString &msg);
    // 函数功能:    记录日志信息,日志等级:fatal
    void fatal(const QString &msg);

private:
    static LogHand *pInstance;
    static QMutex cmutex;
    Log4Qt::Logger *m_customDebug = nullptr;
    Log4Qt::Logger *m_customInfo  = nullptr;
    Log4Qt::Logger *m_customWarn  = nullptr;
    Log4Qt::Logger *m_customError = nullptr;
    Log4Qt::Logger *m_customFatal = nullptr;
};

2.构造/析构函数

在构造函数和析构函数添加如下代码,具体含义参考代码。其实这样使用方式跟QsLog都是类似的,看你习惯,咋样都可以。

LogHand::LogHand()
{
    // 一定要配置文件,不然运行起来会直接当掉
    Log4Qt::BasicConfigurator::configure();
    QString configpath=QCoreApplication::applicationDirPath()+QString("/log/log4qt.properties");
    Log4Qt::PropertyConfigurator::configure(configpath);

    m_customDebug = Log4Qt::Logger::logger("CustomDebug");
    m_customInfo = Log4Qt::Logger::logger("CustomInfo");
    m_customWarn = Log4Qt::Logger::logger("CustomWarn");
    m_customError = Log4Qt::Logger::logger("CustomError");
    m_customFatal = Log4Qt::Logger::logger("CustomFatal");
}

LogHand::~LogHand()
{
    if(pInstance)
        delete pInstance;
}

LogHand *LogHand::getInstance()
{
    if(!pInstance){
        QMutexLocker mutexLocker(&cmutex);
        if(!pInstance){
            LogHand *_pInstance = new LogHand();
            pInstance = _pInstance;
        }
    }
    return pInstance;
}

从上面代码处可以看出,文中在构造函数处调用了log4qt的配置文件log4qt.properties,用于设置日志文件的大小、添加方式、时间日期形式、回滚方式;在析构函数处,添加log指针变量回收功能;外界调用该库时,通过getInstance函数创建一个logHand日志指针变量,并添加了线程锁,进行安全处理。

3.用户定义函数

在logHand类的public公共区,自定义了如下函数,供用户使用,直接调用该函数即可。

/******************************************************************************
** 函数名称:    debug
** 函数功能:    记录日志信息,日志等级:debug
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void LogHand::debug(const QString &msg)
{
    m_customDebug->debug(msg);
}

/******************************************************************************
** 函数名称:    info
** 函数功能:    记录日志信息,日志等级:info
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void LogHand::info(const QString &msg)
{
    m_customInfo->info(msg);
}

/******************************************************************************
** 函数名称:    warn
** 函数功能:    记录日志信息,日志等级:warn
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void LogHand::warn(const QString &msg)
{
    m_customWarn->warn(msg);
}

/******************************************************************************
** 函数名称:    error
** 函数功能:    记录日志信息,日志等级:error
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void LogHand::error(const QString &msg)
{
    m_customError->error(msg);
}

/******************************************************************************
** 函数名称:    fatal
** 函数功能:    记录日志信息,日志等级:fatal
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void LogHand::fatal(const QString &msg)
{
    m_customFatal->fatal(msg);
}

5.使用方法

1.添加二次封装文件

首先创建一个Qt工程项目,带UI-widget设计的。将log4qt添加进去,如下图所示。

然后,将loghand、concretelogclass的源文件和头文件,添加进去,如上图所示。

在点击打开loghand.h文件,按如下修改。

最后将log4qt的配置文件log4qt.propertieslog4qt.properties添加到当前工程目录下面(前面有提到过的),如下图所示。相应的配置文件在文末链接下载。

2.用户使用效果

在项目UI上添加一个按钮,如下所示,点击可以向log日志上写入信息。

相关函数如下,在上一小节QsLog项目上做简单的修改。

运行后打印信息效果如下。


总结

log库里面还有许多功能,更为详细可参考官方给出的示例工程。

博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程,为博文提供案例-CSDN文库

相关推荐
星期⑧不早八1 小时前
Axure RP全面介绍:功能、应用与中文替代方案
ui·axure
汝即来归1 小时前
什么是运算符重载?如何在 C++ 中进行运算符重载?运算符重载在面向对象编程中的好处是什么?
开发语言·c++
IT信息技术学习圈1 小时前
2024年12月CCF编程能力等级认证(GESP)C++一级试卷讲解
开发语言·c++
liupenglove1 小时前
protobuf c++开发快速上手指南
开发语言·c++
星期⑧不早八1 小时前
Axure RP:设计、原型与协作的综合平台
ui·axure
丁劲犇2 小时前
让 Win10 上网本 Debug 模式 QUDPSocket 信号&槽 收发不丢包的方法总结
网络·windows·qt·网络协议·udp·qudpsocket·丢包
卜及中2 小时前
【数据结构】B树家族解析:B树、B+树与B*树的理论与B树插入实现(C++)
开发语言·数据结构·c++·b树
ahauedu4 小时前
SpringBoot中读取mock数据-高效调试接口
spring boot·后端·log4j
PluviophileDD4 小时前
【笔记】C语言转C++
c语言·c++
獨枭4 小时前
MFC 自定义编辑框:打造灵活的数据输入控件
c++·mfc