Qt日志使用

news/2024/10/11 17:26:02/

QsLog使用
这篇讲qt的日志还是比较好的,可以在自己的函数里面配置这个日志框架实现自己所需的功能。
我接触的项目里面,假如有个函数功能执行错误了,我希望可以快速定位到这个错误,这个时候就需要到了日志,我咨询了有经验的工程师,一般对函数功能出错情况定位有三种:

  • 使用try catch语句
  • 日志
  • QMessagesBox

使用try catch语句大多能捕捉到很多错误,我不太用try catch,这个运行如果有错误就会卡在出错的那一段代码那,不会执行try了而是执行catch内的语句

利用日志,就像开头那样,我给个我的例子,用了一个textborwser和两个按钮控件
widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
public:void initLogger();void destroyLogger();
public slots:void logSlot(const QString &message, int level);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include"Log/include/QsLog.h"
#include"Log/include/QsLogDest.h"
#include <iostream>
using namespace std;
using namespace QsLogging;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);initLogger();   //初始化日志}Widget::~Widget()
{delete ui;destroyLogger();//销毁日志
}void Widget::initLogger()
{Logger& logger = Logger::instance();logger.setLoggingLevel(QsLogging::TraceLevel);const QString sLogPath(QDir(QCoreApplication::applicationDirPath()).filePath("log.txt"));DestinationPtr fileDestination(DestinationFactory::MakeFileDestination(sLogPath));DestinationPtr sigsSlotDestination(DestinationFactory::MakeFunctorDestination(this, SLOT(logSlot(QString,int))));logger.addDestination(fileDestination);logger.addDestination(sigsSlotDestination);}//析构
void Widget::destroyLogger()
{QsLogging::Logger::destroyInstance();
}//槽函数
void Widget::logSlot(const QString &message, int level)
{ui->textBrowser->append(qPrintable(message));
}void Widget::on_pushButton_clicked()
{int a=8088,b=9;if(a-b>0)QLOG_ERROR()<<"okok";
}void Widget::on_pushButton_2_clicked()
{int a=18,b=9;if(a-b>0)QLOG_WARN()<<"hdsajhj fdhj";
}

然后在文件夹下就会有:
在这里插入图片描述
这个QsLog日志不支持追加功能好像,但是可以设置日志大小以及可以备份几个之前的日志个数,就是假如你项目运行完一次就是有一个新日志,其实这样也合理着,每执行一次程序就只有一次日志。

使用QmessageBox的话可以这样

int test(){bool isfinish=false;if(命令执行成功){isfinish=true;}else{isfinish=false;}return isfinish;
}
外部
if(!test()){QMessageBox::informatcion();
}

还有一种不用qt的日志框架,自己写一个日志消息处理的函数
代码如下
main.cpp:

#include "widget.h"
#include <QApplication>
#include <QMutex>
#include <QDateTime>
#include <QFile>
#include <QTextStream>void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex mutex;mutex.lock();QString text;switch (type){case QtDebugMsg:text = QString("Debug : ");break;case QtWarningMsg:text = QString("Warning :");break;case QtCriticalMsg:text = QString("Critical : ");break;case QtFatalMsg:text = QString("Fatal ");}QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message = QString("%1%2%3%4").arg(text).arg(context_info).arg(msg).arg(current_date);QString path = QCoreApplication::applicationDirPath() + QString("/log.txt");QFile file(path);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << message << "\r\n";file.flush();file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(outputMessage);Widget w;w.show();return a.exec();
}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#define LOG(X) DebugMessage(X)#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;void DebugMessage(const QString strmessage);
};#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);LOG("hello world");
}Widget::~Widget()
{delete ui;
}void Widget::DebugMessage(const QString strmessage)
{qDebug()<<strmessage;
}

这样只要用到这个LOG宏就直接在log.txt里写入了日志,现象如下:
在这里插入图片描述


http://www.ppmy.cn/news/1424594.html

相关文章

华为OD-C卷-靠谱的车[100分]C语言-100%

题目描述 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 23再多一块钱就变为25;39再多一块钱变为50;399…

校园综合服务平台V3.9.2 源码修复大部分已知BUG

校园综合服务平台&#xff0c;版本更新至V3.9.1 &#xff0c;源码功能强大&#xff0c;ui 精美&#xff0c; 功能包含但不限于校园跑腿&#xff0c;外卖&#xff0c;组局&#xff0c;圈子&#xff0c;商城&#xff0c;抽奖&#xff0c;投票&#xff0c;团购&#xff0c;二手市场…

自然语言处理NLP:文本预处理Text Pre-Processing

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容&#xff0c;助力自然语言处理和模型的生成使用。 1.文本…

ES6的模块化

ES6模块化是JavaScript的一种组织代码的方式&#xff0c;它允许开发者将代码分割成多个独立的部分&#xff08;模块&#xff09;&#xff0c;每个模块有自己的作用域和接口&#xff0c;模块之间可以通过导入&#xff08;import&#xff09;和导出&#xff08;export&#xff09…

AI讲师人工智能讲师大模型培训讲师叶梓:突破大型语言模型推理效率的创新方法

大型语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;任务中展现出了前所未有的能力&#xff0c;但它们对计算资源的巨大需求限制了其在资源受限环境中的应用。SparQ Attention算法提出了一种创新的方法&#xff0c;通过减少注意力机制中的内存带…

C++初阶学习第一弹——C++入门(上)

前言&#xff1a; 很高兴&#xff0c;从今天开始&#xff0c;我们就要步入C的学习了&#xff0c;在这之前我们已经对C语言有了不错的了解&#xff0c;对数据结构也有了一些自己的认识&#xff0c;今天开始&#xff0c;我们就进入这个新的主题的学习——C 目录 一、C的发展即其特…

AI大模型之路 第二篇: Word2Vec介绍

你好&#xff0c;我是郭震 今天我来总结大模型第二篇&#xff0c;word2vec&#xff0c;它是大模型的根基&#xff0c;一切NLP都会用到它。 Word2Vec Word2Vec 是一种流行的自然语言处理&#xff08;NLP&#xff09;工具&#xff0c;它通过将词汇表中的每个单词转换成一个独特的…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…