Qt开发 系列文章 - log(四)
目录
前言
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第三方控件开源库及特点和用途简要描述如下:
-
QsLog是一个轻量级的日志库,用于在Qt应用程序中记录和输出日志信息;
-
****QXlsx****是一个用于读写Microsoft Excel文件的库,使Qt应用程序能够处理Excel数据;
-
**QCustomPlot**是一个绘制图表、曲线、统计图等的库,具有灵活的定制化和丰富的功能;
-
**QHotkey**是一个简单易用的库,用于在Qt应用程序中注册全局快捷键;
-
**QtSerialPort**是Qt官方提供的库,用于串口通信,支持跨平台使用;
-
****QJson****是用于JSON数据解析和生成的库,方便处理JSON格式的数据;
-
**QwtPlot3D**是绘制三维图形的库,支持曲面图、线框图、散点图等。
二、LOG日志
Qt Log日志的主要作用及重要性包括:
- 在程序的开发和测试阶段,日志可以帮助开发者快速定位和解决程序中的bug;
- 通过分析日志数据,可以了解程序的运行性能,包括响应时间、处理速度等;
- 在程序运行时,日志可以记录用户的操作行为,有助于后续的行为分析和用户习惯研究;
- 在程序发生崩溃或异常时,日志中的错误信息和堆栈跟踪可以帮助开发者快速定位问题原因;
- 重要性在于,它是连接程序运行时的内部状态和外部世界的桥梁,是开发者了解程序行为和状态的重要手段。
开发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文库。