Qt日志使用

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.mzph.cn/web/666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【备忘录】openssl记录

openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj “/CCN/STBeijing/LBeijing/Okubernetes/OUKubernetes-manual/CNkubernetes-ca” openssl genrsa -out etcd-ca.key 2048 openssl req -x509 -new -nodes -key etc…

【Java实战】使用自定义注解实现参数校验详解

文章目录 前言📝一、Java注解简介二、启用注解校验1.启用注解2.注解@Valid和 @Validated2.1@Valid级联校验2.2@Validated高级使用三、自定义注解1.统一异常处理2.编写注解2.1 自定义校验2.2 多参数校验总结前言📝 由于实际开发中遇到大量相同的条件参数验证,不想写重复代…

Python测试转岗网络安全测试,挑战年薪30W+

有许多人问我安全测试前景怎么样&#xff1f; 目前&#xff0c;网络安全市场可大致分为17大安全领域、59个细分领域。不同领域大类核心技术相距甚远&#xff0c;因此绝大多数企业都选择专注于几个细分市场上。产品终端使用者主要以政企、军队、运营商、金融、医疗、教育、交通…

【技巧】PPT文件如何添加公司LOGO?

在工作上&#xff0c;我们经常要给PPT文件添加上公司的logo&#xff0c;如果一页一页添加不但耗时耗力&#xff0c;还容易有遗漏。那怎样快速给PPT添加logo呢&#xff1f;不清楚的小伙伴一起来看看如何吧&#xff01; 操作步骤&#xff1a; 1.打开PPT文件&#xff0c;点击菜单…

【DM8】ODBC

官网下载ODBC https://www.unixodbc.org/ 上传到linux系统中 /mnt下 [rootstudy ~]#cd /mnt [rootstudy mnt]# tar -zxvf unixODBC-2.3.12.tar.gz [rootstudy mnt]# cd unixODBC-2.3.12/ [rootstudy unixODBC-2.3.12]# ./configure 注意&#xff1a;若是报以上错 则是gcc未安…

【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)

前言 本篇博客我们来实现一个小游戏项目——贪吃蛇&#xff0c;相信肯定很多人都玩过&#xff0c;那么整个贪吃蛇是怎么实现出来的那&#xff0c;这个项目用到了很多方面的知识&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这…

前端正则表达式js和测试工具

一、校验数字的表达式 1. 数字&#xff1a;^[0-9]*$2. n位的数字&#xff1a;^\d{n}$3. 至少n位的数字&#xff1a;^\d{n,}$4. m-n位的数字&#xff1a;^\d{m,n}$5. 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$6. 非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-9…

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

算法课程笔记——pair的使用

先思考&#xff0c;为什么 STL 中的容器和算法都是用的左闭右开区间&#xff1f; | | | 这样迭代器只需要支持和!(或者<或者)操作就可以方便的进行区间遍历了。 其它区间设置的话&#xff0c;要么得支持<操作&#xff0c;要么得在循环体内&#xff0c;操作之前进行!判定。…

牛客2024 【牛客赛文X】春招冲刺 ONT34 加油站【中等 贪心 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a013a0691a0343aeb262ca1450d2fe4e 思路 贪心&#xff1a; 如果总的gas小于走完全程的cost&#xff0c;直接返回-1不需要再找了 如果确保了可以走完一圈之后&#xff0c;那么从index 0开始找&#xff0c; 当g…

java-生产者消费者

目录 1.生产者消费者1.1生产者和消费者模式概述【应用】1.2生产者和消费者案例【应用】1.3生产者和消费者案例优化【应用】1.4阻塞队列基本使用【理解】1.5阻塞队列实现等待唤醒机制【理解】 1.生产者消费者 1.1生产者和消费者模式概述【应用】 概述 生产者消费者模式是一个十…

Linux软件包管理器yum—1

目录 一、Linux下软件安装的方式 二、yum 2.1查看yum已配置的源&#xff1a; 2.2查看yum配置文件&#xff1a; 2.3使用root用户安装软件&#xff1a; 2.4模糊搜索 2.5安装软件&#xff1a; 2.6卸载软件&#xff1a; 2.7扩展源&#xff1a; 2.8yum源更新&#xff1a; 一…

实验室三大常用仪器2---函数信号发生器的基本使用方法(笔记)

目录 函数信号发生器的基本使用方法 如何连接函数信号发生器和示波器 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器3---交流毫伏表的使用方法&#xff08;笔记&#xff09;-CSDN博客 示波器是用来显示和测量信号的…

NLP预训练模型- GPT-3学习指南与学习总结案例

NLP预训练模型GPT-3学习指南与学习案例 学习指南 GPT-3&#xff0c;作为OpenAI开发的一种先进的语言生成模型&#xff0c;具有强大的语言理解和生成能力。为了有效地学习和应用GPT-3&#xff0c;以下是一些建议的学习指南&#xff1a; 理解模型原理&#xff1a;首先&#xf…

05-Logistic Softmax详解

Logistic Regression 本章我们来看另一个简单且强大的解决线性回归二元分类问题的算法&#xff0c; 即逻辑回归。不要望文生义&#xff0c; 逻辑回归虽然带回归这个字眼&#xff0c; 但它其实处理的是分类任务&#xff0c;即逻辑回归是一种分类模型&#xff0c; 而非回归模型&…

Docker(九):MySQL主从复制搭建

一&#xff1a;master 1.1 /mydata/mysql-master/conf/my.conf [mysqld] #同一局域网需要唯一 server_id101 # 不需要同步的数据库 binlog-ignore-dbmysql # 开启二进制日志 log-binmall-mysql-bin # 二进制日志使用内存大小 binlog_cache_size1M # 二进制日志格式 binlog_fo…

西夏区第三届中华诗词大会活动方案

活动流程/比赛规则 1.【13:30-14:10】 参赛选手签到&#xff1b;领取参赛号码牌&#xff1b;分组抽签&#xff1b;拍摄赛前感言&#xff0c;集体祝福口号&#xff1b; 2.【14:10-14:25】 熟悉设备、答题环节、题目设置等&#xff0c;走台演练 3.【14:25-14:30】 播放暖场视频…

程序员如何在副业上突破时间片限制

前面我们讨论了如何优化时间片的使用&#xff0c;敏锐的读者可能已经意识到&#xff0c;实际上有方法可以突破时间片的限制。下面我们将具体探讨如何实现这一点。 倍增 第一个策略称为“倍增”&#xff0c;即成倍增加可用的时间片数量。但这需要在一个前提下进行&#xff1a;不…

怎么配置python

右键点击“计算机”&#xff0c;选择“属性”。 在左侧栏找到“高级系统设置”。 点击“环境变量”。 在系统变量中&#xff0c;双击“Path”。 在字符串的末尾&#xff0c;加一个分号; 然后再输入你安装python的路径&#xff0c;如图所示&#xff1a; 点击“确定”&#xff0…