使用Qt实现简单的日志记录功能(qInstallMessageHandler)

2023-10-27

前言:

相信大家在软件开发的过程中,都有记录软件运行日志的需求,凭借日志信息来分析软件的运行状况,或者是查找、定位软件存在的未知Bug。

基于C++的日志工具有log4cplus、log4cxx,Log4Qt等,但如果只是并非复杂的环境使用,其实我们可以讲Qt的消息输出,重定向到日志文件,就可以实现一个简单的日志记录系统。

Qt包含用于警告和调试文本的全局宏:

 1. qDebug()  :调试消息
 2. qInfo()  : 信息消息
 3. qWarning() :  警告消息和可恢复的错误
 4. qCritical()  :关键错误和系统错误
 5. qFatal() :致命错误

Qt Assistant原文:
Qt includes global macros for writing out warning and debug text. You can use them for the following purposes:
- qDebug() is used for writing custom debug output.
- qInfo() is used for informational messages.
- qWarning() is used to report warnings and recoverable errors in your application.
- qCritical() is used for writing critical error messages and reporting system errors.
- qFatal() is used for writing fatal error messages shortly before exiting.

实践:

下面列出代码:

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    QString text;
    switch (type)
    {
    case QtDebugMsg:
        text = QString("Debug: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);
        break;
    case QtInfoMsg:
        text = QString("Info: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);      
        break;
    case QtWarningMsg:
        text = QString("Warning: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);
        break;
    case QtCriticalMsg:
        text = QString("Critical: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);
        break;
    case QtFatalMsg:
        text = QString("Fatal: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);
        abort();
    default:
        text = QString("Default: %1 (%2:%3, %4)\n").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function);
    }
    gOutStream << QDateTime::currentDateTime().toString("yyyy-MM-dd hh.mm.ss ") + text; //输出到txt文件
    gOutStream .flush(); //刷新缓冲区
}

在应用程序的main函数中,注册我们的回调函数:

 qInstallMessageHandler(myMessageOutput);

上面的代码片中,gOutStream 是一个全局的输出流,我们可以将其输出到文件,。

 QFile file("log.txt");
      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;
 QTextStream gOutStream (&file);
 qDebug<< "这是日志输出" ;

在Debug模式下,可以将信息输出定位到某个具体的文件、某个函数、某行代码,可以说是非常强大了。

下面是运行txt日志文件的效果截图:

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Qt实现简单的日志记录功能(qInstallMessageHandler) 的相关文章

  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • PyQt - 如何从给定的小部件获取顶级父级?

    给定的小部件如何访问它最旧的父级 即顶级小部件 我需要 showMinimized it 现在我正在使用 self parent parent parent showMinimized 但这似乎不是最好的方法 如果它移动了 我需要手动更改父
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方

随机推荐

  • 识别和检测的区别

    检测是识别的位置 识别是识别这东西是什么 虽然都是判断 但识别是分类 检测是定位
  • 数据拆分_SPSS篇——数据的拆分

    我们在进行数据处理时 有时需要将某些分类变量进行分层分析 例如对不同地区 不同城市化水平的产品销售量来进行分析 此时就需要通过数据的拆分来实现 那么在SPSS中 是如何来实现数据的拆分呢 下面我们具体来看下 Step1 在SPSS中打开数据
  • 老程序员的思想变迁

    蓦然回首自己做软件开发这个行业已经十年了 这十年中我获得了很多 技术能力 培训 出国 大公司的经历 还有很多很好的朋友 但再仔细一想 这十年中我至少浪费了五年时间 这五年可以足够让自己成长为一个优秀的程序员 可惜我错过了 我用这五年时间和很
  • 手机配合termux部署DDbot 教程

    前言 针对有闲置手机 不方便长时间开电脑 无云服务器等设备的用户 提供的一套DDbot部署方案 要求 安卓手机 持续供电 网络 流量卡或者wifi等 风险 如果是长时间的充电对手机电池有损坏 有其他up的方案是配合智能插座 通过IOT形式定
  • WSL中ADB工具无法识别设备解决方案

    WSL中ADB工具无法识别设备解决方案 楼主所使用的WSL为 wsl 18 04版本 在windows中正常使用adb调试嵌入式设备后 发现在wsl中存在adb无法识别设备问题 原因 windows 系统的adb version 必须与li
  • Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)

    打算将D365 CRM接入公司统一身份认证平台 前提 D365 已IFD部署 因为要借助ADFS来完成单点登录 登录ADFS服务器 打开ADFS 本次集成 统一身份认证为上游 ADFS是下游 因为要设置统一身份认证系统添加到ADFS的声明提
  • 深入学习前端开发,掌握HTML、CSS、JavaScript等技术

    课程链接 链接 https pan baidu com s 1WECwJ4T8UQfs2FyjUMbxig pwd i654 提取码 i654 复制这段内容后打开百度网盘手机App 操作更方便哦 来自百度网盘超级会员v4的分享 课程介绍 第
  • 【项目设计】负载均衡在线OJ

    Linux 博客主页 一起去看日落吗 分享博主的在Linux中学习到的知识和遇到的问题 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 看似不起波澜的日复一日 一定会在某一天让你看见坚持的意义 祝我们都能在鸡零狗碎里找
  • 信息学奥赛C++语言:最高分数的学生姓名

    题目描述 输入学生的人数 然后再输入每位学生的分数和姓名 求获得最高分数的学生的姓名 输入 第一行输入一个正整数N N 100 表示学生人数 接着输入N行 每行格式 分数 姓名 分数是一个非负整数 且小于等于100 姓名为一个连续的字符串
  • catkin_make出现CMake Error: The source directory “/home/ming/catkin_ws_test/src“ does not ex

    问题 catkin make出现CMake Error The source directory home ming catkin ws test src does not exist 解决 删除与src同目录下的编译文件夹build和de
  • 豆瓣api访问流程

    豆瓣api访问流程 1 https api douban com 2 通过文档查找接口Resources URI 如 v2 movie in theaters添加到1后面 3 将 apikey 0b2bdeda43b5688921839c8
  • UE中FRotator和Pitch(Roll,Yaw)以及相对朝向的关系

    前几天 看人宅的塔防视频教程 他使用了塔的成员变量rotator 我可能在哪里少写了 所以 老是朝向不对 跟踪调试了下 发现FRotator是由pitch roll yaw三个部分组成 而pitch roll yaw是局部坐标系中的朝向 那
  • 雷达水位计安装细节注意点

    近年来 随着国家防汛抗旱工作对中小河流水文监测的要求不断提高 许多流域及大中型水库 电站逐步建立了水情自动测报系统 而水位监测则是测报系统的重要组成部分 水位传感器的适用性是建立系统的重要因素 随着自动测报系统的发展 各类水位传感器在不同的
  • 卡特尔16PF性格测试与答案

    大学生在职业生涯规划时 必须充分注意到自己的性格和职业的适宜性 性格是指一个人在生活中形成的对现实的稳定的态度和行为方式 研究表明 性格影响着一个人的职业取向 由于性格的不同 每个人对工作和职业的态度也是不同的 一定的性格必然适合从事一定的
  • Java多线程实现

    Java多线程 多线程的创建方式 方式一 继承Thread类 创建一个继承Thread类的子类 重写Thread类中的run方法 创建Thread子类对象 通过此对象调用start 方法 public class ThreadDemo1 p
  • 蓝桥杯超时?给你一些小技巧

    自己在敲代码的时候碰到了超时的情况 总结了一下 1 统一定义变量 不要在循环内定义局部变量 2 把函数定义放在main函数之前 可以减少在main函数内的声明 3 循环尽量增设break条件 对循环进行剪枝可以减少不必要循环 4 尽量省略头
  • Django框架 - 路由配置全解

    Django框架学习笔记 路由配置全解 文章目录 1 初始配置 2 路由配置 2 1 一般路由 命名路由与reverse 函数 2 2 子路由 命名空间与reverse 函数 2 3 带参路由 reverse 函数 自定义path转换器 2
  • LeetCode周赛159

    1232 Check If It Is a Straight Line 检查是否为直线 暴力算斜率 但要注意分母为0的情况 class Solution public bool checkStraightLine vector
  • 重新审视Faster RCNN:优缺点与改进

    重新审视Faster RCNN Faster RCNN优点 Faster RCNN缺点 对于Faster RCNN的改进算法 特征融合 HyperNet 实例分割 Mask RCNN 全卷机网络 R FCN 级联网络 Cascade RCN
  • 使用Qt实现简单的日志记录功能(qInstallMessageHandler)

    前言 相信大家在软件开发的过程中 都有记录软件运行日志的需求 凭借日志信息来分析软件的运行状况 或者是查找 定位软件存在的未知Bug 基于C 的日志工具有log4cplus log4cxx Log4Qt等 但如果只是并非复杂的环境使用 其实