当前位置: 首页 > article >正文

Qt 调试信息重定向到本地文件

1、在Qt软件开发过程中,我们经常使用qDebug()输出一些调试信息在QtCreator终端上。
  但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后,系统中没有QtCreator和编译环境,那应用程序出现问题,如何输出信息排查呢?
  
2、一个好方法就是Qt调试信息重定向本地文件,即仍然使用qDebug()等函数,但设置后调试信息不输出在终端上,而是输出到指定路径的日志文件中,这样我们就可以通过日志进行调试。

3、Qt提供了5个全局信息输出函数,对应不同级别:
  (1)、qDebug(): 调试信息。
  (2)、qInfo(): 普通信息。
  (3)、qWarning(): 警告信息。
  (4)、qCritical(): 关键错误和系统错误信息。
  (5)、qFatal(): 致命错误信息,如果运行qFatal(),应用程序会立即终止。
  
4、Qt调试信息重定向本地文件,只要实现消息处理函数,然后通过qInstallMessageHandler重定义,就可以将调试信息输出到指定路径的文件中了。

5、示例: (main.cpp, 其它文件略)

//main.cpp#include "widget.h"
#include <QApplication>
#include <QMutex>
#include <QDateTime>
#include <QFile>
#include <QDebug>static QMutex mutex;
void MyLog(QtMsgType type, const QMessageLogContext & context, const QString & message)
{mutex.lock();QString strType;switch (type) {case QtDebugMsg:strType = "Debug";break;case QtInfoMsg:strType = "Info";break;case QtWarningMsg:strType = "Warning";break;case QtCriticalMsg:strType = "Critical";break;default:break;}QString strFile = context.file;QString strLine = QString::number(context.line);QString strFunc = context.function;QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");QString strLog = QString("[%1][%2][%3][%4][%5]%6.").arg(strType).arg(strFile).arg(strLine).arg(strFunc).arg(strTime).arg(message);QString strFileName = QString("App_%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd"));QFile file(strFileName);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream stream(&file);stream << strLog << "\r\n";file.flush();file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(MyLog);qDebug() << "This is Debug";qInfo() << "This is Info";qWarning() << "This is Warning";qCritical() << "This is Critical";Widget w;w.show();return a.exec();
}

//运行结果,在exe同级目录下有一个如App_20250425.log文件,里面包含各种输出信息。

[Debug][..\..\main.cpp][57][int __cdecl main(int,char *[])][2025-04-25 16:55:49]This is Debug.
[Info][..\..\main.cpp][58][int __cdecl main(int,char *[])][2025-04-25 16:55:49]This is Info.
[Warning][..\..\main.cpp][59][int __cdecl main(int,char *[])][2025-04-25 16:55:49]This is Warning.
[Critical][..\..\main.cpp][60][int __cdecl main(int,char *[])][2025-04-25 16:55:49]This is Critical.
[Debug][..\..\main.cpp][57][int __cdecl main(int,char *[])][2025-04-25 16:56:51]This is Debug.
[Info][..\..\main.cpp][58][int __cdecl main(int,char *[])][2025-04-25 16:56:51]This is Info.
[Warning][..\..\main.cpp][59][int __cdecl main(int,char *[])][2025-04-25 16:56:51]This is Warning.
[Critical][..\..\main.cpp][60][int __cdecl main(int,char *[])][2025-04-25 16:56:51]This is Critical.

相关文章:

Qt 调试信息重定向到本地文件

1、在Qt软件开发过程中&#xff0c;我们经常使用qDebug()输出一些调试信息在QtCreator终端上。 但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后&#xff0c;系统中没有QtCreator和编译环境&#xff0c;那应用程序出现问题&#xff0c;如何输出信息排查…...

MyBatisPlus文档

一、MyBatis框架回顾 使用springboot整合Mybatis,实现Mybatis框架的搭建 1、创建示例项目 (1)、创建工程 新建工程 创建空工程 创建模块 创建springboot模块 选择SpringBoot版本 (2)、引入依赖 <dependencies><dependency><groupId>org.springframework.…...

Memcached 主主复制架构搭建与 Keepalived 高可用实现

实验目的 掌握基于 repcached 的 Memcached 主主复制配置 实现通过 Keepalived 的 VIP 高可用机制 验证数据双向同步及故障自动切换能力 实验环境 角色IP 地址主机名虚拟 IP (VIP)主节点10.1.1.78server-a10.1.1.80备节点10.1.1.79server-b10.1.1.80 操作系统: CentOS 7 软…...

Android 使用支付接口,需要进行的加密逻辑:MD5、HMAC-SHA256以及RSA

目录 前言MD5HMAC-SHA256RSA其他 前言 不使用加密​​&#xff1a;支付系统如同「裸奔」&#xff0c;面临数据泄露、资金被盗、法律追责等风险。 正确使用加密​​&#xff1a;构建「端到端安全防线」&#xff0c;确保交易合法可信&#xff0c;同时满足国际合规要求。 支付系…...

软件工程效率优化:一个分层解耦与熵减驱动的系统框架

软件工程效率优化&#xff1a;一个分层解耦与熵减驱动的系统框架** 摘要 (Abstract) 本报告构建了一个全面、深入、分层的软件工程效率优化框架&#xff0c;旨在超越简单的技术罗列&#xff0c;从根本的价值驱动和熵减原理出发&#xff0c;系统性地探讨提升效率的策略与实践。…...

鸿蒙ArkUI之相对布局容器(RelativeContainer)实战之狼人杀布局,详细介绍相对布局容器的用法,附上代码,以及效果图

在鸿蒙应用开发中&#xff0c;若是遇到布局相对复杂的场景&#xff0c;往往需要嵌套许多层组件&#xff0c;去还原UI图的效果&#xff0c;若是能够掌握相对布局容器的使用&#xff0c;对于复杂的布局场景&#xff0c;可直接减少组件嵌套&#xff0c;且随心所欲完成复杂场景的布…...

详解 Servlet 处理表单数据

Servlet 处理表单数据 1. 什么是 Servlet&#xff1f;2. 表单数据如何发送到 Servlet&#xff1f;2.1 GET 方法2.2 POST 方法 3. Servlet 如何接收表单数据&#xff1f;3.1 获取单个参数&#xff1a;getParameter()示例&#xff1a; 3.2 获取多个参数&#xff1a;getParameterV…...

Spring Cloud Gateway 如何将请求分发到各个服务

前言 在微服务架构中&#xff0c;API 网关&#xff08;API Gateway&#xff09;扮演着非常重要的角色。它负责接收客户端请求&#xff0c;并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关&#xff0c;支持动态路由、…...

解释器体系结构风格-笔记

解释器&#xff08;Interpreter&#xff09;是一种软件设计模式或体系结构风格&#xff0c;主要用于为语言&#xff08;或表达式&#xff09;定义其语法、语义&#xff0c;并通过解释器来解析和执行语言中的表达式。解释器体系结构风格广泛应用于编程语言、脚本语言、规则引擎、…...

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…...

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …...

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…...

11.原型模式:思考与解读

原文地址:原型模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在软件开发中&#xff0c;尤其是当需要创建大量相似对象时&#xff0c;你是否遇到过这样的情况&#xff1a;每次创建新对象时&#xff0c;是否都需要重新初始化一些复杂的…...

深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`

Java 泛型中的通配符 ? 与 super、extends 关键字组合形成的 <? super T> 和 <? extends T> 是泛型系统中最重要的概念之一&#xff0c;也是许多开发者感到困惑的地方。本文将全面剖析它们的语义、使用场景和设计原理。 一、基础概念回顾 1. 泛型通配符 ? ?…...

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;会遇到一个问题。开发的ios应用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的签名证书&#xff0c;并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下&#xff0c;如何在windows电脑&…...

Golang | 位运算

位运算比常规运算快&#xff0c;常用于搜索引擎的筛选功能。例如&#xff0c;数字除以二等价于向右移位&#xff0c;位移运算比除法快。...

天能资管(SkyAi):大数据洞察市场,引领投资新风向

在金融市场的浩瀚海洋中,信息如同灯塔,指引着投资者前行的方向。谁能更准确地把握市场动态和趋势,谁就能在激烈的市场竞争中占据先机。天能资管(SkyAi),作为卡塔尔投资局(QIA)旗下的科技先锋,凭借其强大的大数据处理能力与前沿的技术架构,为全球投资者提供了前所未有的市场洞察…...

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号

单分子荧光成像技术&#xff0c;作为生物分子动态研究的关键工具&#xff0c;对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂&#xff0c;动态范围有限&#xff0c;满阱容量低等问题&#xff0c;制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势&#xff0c;自研…...

基于大牛直播SDK的Android屏幕扬声器采集推送RTMP技术解析

在移动互联网时代&#xff0c;直播技术的应用越来越广泛&#xff0c;而屏幕采集推送作为直播内容源的重要获取方式之一&#xff0c;也备受关注。本文将基于大牛直播SDK&#xff0c;深入剖析如何实现Android屏幕采集推送RTMP的完整流程&#xff0c;带你领略其背后的技术细节与魅…...

Linux防火墙工具UFW介绍

UFW(Uncomplicated Firewall)是 Ubuntu、Debian 等 Debian 系 Linux 发行版默认的防火墙管理工具,基于 iptables 开发,旨在通过简化的命令行接口(CLI)降低防火墙配置门槛,适合新手和简单场景。 核心目标:让用户无需深入理解 iptables 的 “表 - 链” 结构,通过直观的命…...

k8s 手动续订证书

注意:如果是高可用环境,本文的操作需要在所有控制节点都执行。 查看证书是否过期 kubeadm certs check-expirationkubeadm certs renew可以续订任何特定证书,或者使用子命令all可以续订所有证书: kubeadm certs renew all使用 kubeadm 构建的集群通常会将admin.conf证书复…...

vc++ 如何调用poco库

1. 下载并安装 Poco 库 你可以从 Poco 的官方网站&#xff08;POCO C Libraries - Simplify C Development &#xff09;下载其源代码压缩包。下载完成后&#xff0c;按照下面的步骤进行编译和安装&#xff1a; 解压源代码&#xff1a;把下载的压缩包解压到指定目录。配置编译…...

Hot100方法及易错点总结2

本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多&#xff0c;必须多做几遍)138.随机链表的复制148.排序链表 N…...

网络:手写HTTP

目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议&#xff0c;站在TCP的角度看&#xff0c;要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…...

C++[类和对象][3]

C[类和对象][3] 赋值运算符的重载(operator) 1.是一个默认成员函数,重载必须为成员函数,用于两个已经存在的对象,(d1d3赋值重载)(Stack d4d1拷贝构造(因为d4未存在,初始化)) 2.建议写成引用返回提高效率,可以连续赋值重载 3.没有写的时候会自动生成,完成值拷贝/浅拷贝对(对于…...

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析

基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南&#xff1a;从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…...

【python】如何将python程序封装为cpython的库

python程序在发布时&#xff0c;往往会打包为cpython的库&#xff0c;并且根据应用服务器的不同架构&#xff08;x86/aarch64&#xff09;&#xff0c;以及python的不同版本&#xff0c;封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式&#xff1a; 首…...

【人工智能】DeepSeek 的开源生态:释放 AI 潜能的社区协同与技术突破

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek 作为中国 AI 领域的先锋,以其高效的混合专家模型(MoE)和彻底的开源策略,在全球 AI 社区掀起波澜。本文深入剖析 DeepSeek 的开…...

【差分隐私】假设检验的视角(高斯差分隐私)

在差分隐私中&#xff0c;假设检验的框架被用来量化攻击者通过机制输出区分两个相邻数据集 S S S 和 S ′ S S′ 的难度。这种区分的根本困难直接反映了隐私保护强度。以下是对问题的详细解释&#xff1a; 1. 假设检验的基本设定 原假设 H 0 H_0 H0​&#xff1a;数据集为 …...

计算机组成原理 课后练习

例一&#xff1a; 例二&#xff1a; 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式&#xff1a;最高位为符号位&#xff08;0表示正&#xff0c;1表示负&#xff09;&#xff0c;其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘&#xff0c;并通…...