Qt之QDebug日志输出(含源码)

2024-05-03 17:20
文章标签 输出 源码 日志 qt qdebug

本文主要是介绍Qt之QDebug日志输出(含源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、日志输出示例
    • 1.Qt帮助示例源码
    • 2.纯净日志输出(日志内容所见即所得)
    • 3.Qt格式化输出Qt输出栏(输出至Qt输出栏,不包括文件)
    • 4.Qt格式化输出到文件
  • 二、日志文件输出的相关理解
    • 1.Qt日志输出函数参数分析
    • 2.qInstallMessageHandler函数理解
    • 3.qSetMessagePattern函数理解
    • 4.qFormatLogMessage函数理解
  • 三、源码
    • main.cpp
    • mainwindow

一、日志输出示例

1.Qt帮助示例源码

Qt帮助示例源码,自定义输出格式(通过传入的QMessageLogContext对象获取相关信息),但并未输出文件。
请添加图片描述

2.纯净日志输出(日志内容所见即所得)

输出函数传入的什么值则把什么值写入到日志文件中。
请添加图片描述

3.Qt格式化输出Qt输出栏(输出至Qt输出栏,不包括文件)

使用qSetMessagePattern格式化输出内容,并将输出值写入至日志文件中。
请添加图片描述

4.Qt格式化输出到文件

使用qSetMessagePattern函数定义格式,并使用qFormatLogMessage函数格式化输出值写入文件中。
请添加图片描述

二、日志文件输出的相关理解

1.Qt日志输出函数参数分析

下方是日志输出程序的函数格式,参数分别是消息类型、消息上下文信息、消息原数据

void myMessageOutput(**QtMsgType type**, **const QMessageLogContext &context**, **const QString &msg**)
  1. QtMsgType type:消息类型,可根据传入的类型数据通过判断做出不同操作,以下是类型枚举。
enum QtMsgType { QtDebugMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtInfoMsg, QtSystemMsg = QtCriticalMsg }
  1. const QMessageLogContext &context:输出数据上下文信息,该对象包含输出数据的版本、输出行号、输出函数名、输出文件名、输出类别(此处类别值得不是QtMsgType的类型)。
  2. const QString &msg:输出函数的实际输出数据。

2.qInstallMessageHandler函数理解

指定日志输出函数(安装消息处理程序),指定的日志函数参数格式参考Qt日志输出函数参数分析

3.qSetMessagePattern函数理解

设置输出数据格式(设置消息模式),但仅限于输出到“应用程序输出”窗口中,如使用了qInstallMessageHandler,传入输出函数的数据依旧是原内容。

  1. Qt示例格式串解析
// Qt示例格式串
#define QT_MESSAGE_PATTERN "[%{time yyyyMMdd h:mm:ss.zzz t}%{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}]""%{file}:%{line} - %{message}"

%{time yyyyMMdd h:mm:ss.zzz t}:时间格式化信息,以当前时间为准,该格式输出数据示例“20240503 12:40:36.989 中国标准时间”。
%{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}:根据输出类型输出不同的数据信息。
%{file}:输出数据的实际文件名
%{line}:输出数据的实际行号
%{message}:输出数据的原数据

  1. Qt自带的参数占位符
占位符释义
%{appname}应用程序名称,受pro文件中的TARGET和QApplication::setApplicationName(优先级更高)的影响
%{category}日志类别
%{file}输出调用的文件名
%{function}输出调用的所在函数
%{line}输出调用的所在行
%{message}输出实际信息
%{pid}输出进程的pid(QCoreApplication::applicationPid())
%{threadid}输出线程的线程id
%{qthreadptr}输出线程的线程指针(QThread::currentThread()的结果)
%{type}输出类型:warning debug info critical fatal
%{time process}进程运行的时间(自进程启动以来的秒数)
%{time boot}计算机Boot启动时间的时间戳(ms)
%{time [format]}时间信息(带格式化信息)
%{backtrace [depth=N] }暂略:此扩展仅在某些平台上可用(目前仅在使用glibc的平台上可用)

4.qFormatLogMessage函数理解

格式化日志信息, 根据qSetMessagePattern函数定义的规则格式化传入的日志信息,建议在qInstallMessageHandler指定的日志输出函数中使用

三、源码

main.cpp

#include "mainwindow.h"#include <QApplication>#include <QDebug>
#include <QFile>
#include <qlogging.h>#define TYPE_FLAG 1#if 1 == TYPE_FLAG#define OUTPUT_QT_HELP_EXAMPLE      // Qt帮助示例输出
#elif 2 == TYPE_FLAG#define OUTPUT_PURE_EXAMPLE         // 纯净输出(不夹带任何格式,日志所见即所得)
#elif 3 == TYPE_FLAG#define OUTPUT_FORMAT_QT_EXAMPLE    // 格式化输出到Qt程序输出栏中
#elif 4 == TYPE_FLAG#define OUTPUT_FORMAT_FILE_EXAMPLE  // 格式化输出到指定输出文件中
#endifQString g_fileName;#define QT_MESSAGE_PATTERN "[%{time yyyyMMdd h:mm:ss.zzz t}%{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}]""%{file}:%{line} - %{message}"//! Qt帮助示例源码
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);//! 纯净输出
void myMessageOutputForPure(QtMsgType type, const QMessageLogContext &context, const QString &msg);//! 格式输出到Qt程序输出栏
void myMessageOutputForQtConsole(QtMsgType type, const QMessageLogContext &context, const QString &msg);//! 格式输出到指定文件中
void myMessageOutputForFile(QtMsgType type, const QMessageLogContext &context, const QString &msg);int main(int argc, char *argv[])
{#ifdef OUTPUT_QT_HELP_EXAMPLE //! Qt帮助示例输出// 指定日志输出函数(安装消息处理程序)qInstallMessageHandler(myMessageOutput);
#elif defined(OUTPUT_PURE_EXAMPLE) //! 纯净输出(不夹带任何格式,日志所见即所得)g_fileName = "myMessageOutputForPure.log";// 指定日志输出函数(安装消息处理程序)qInstallMessageHandler(myMessageOutputForPure);
#elif defined(OUTPUT_FORMAT_QT_EXAMPLE) //! 格式化输出到Qt程序输出栏中g_fileName = "myMessageOutputForQtConsole.log";// 设置输出数据格式(设置消息模式)qSetMessagePattern(QT_MESSAGE_PATTERN);// 指定日志输出函数(安装消息处理程序)qInstallMessageHandler(myMessageOutputForQtConsole);
#elif defined(OUTPUT_FORMAT_FILE_EXAMPLE) //! 格式化输出到指定输出文件中g_fileName = "myMessageOutputForFile.log";// 设置输出数据格式(设置消息模式)qSetMessagePattern(QT_MESSAGE_PATTERN);// 指定日志输出函数(安装消息处理程序)qInstallMessageHandler(myMessageOutputForFile);
#endifQApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QByteArray localMsg = msg.toLocal8Bit();const char *file = context.file ? context.file : "";const char *function = context.function ? context.function : "";switch (type) {case QtDebugMsg:fprintf(stderr, "Debug: %s (%s:%u, %s  %s)\n", localMsg.constData(), file, context.line, function, context.category);break;case QtInfoMsg:fprintf(stderr, "Info: %s (%s:%u, %s  %s)\n", localMsg.constData(), file, context.line, function, context.category);break;case QtWarningMsg:fprintf(stderr, "Warning: %s (%s:%u, %s  %s)\n", localMsg.constData(), file, context.line, function, context.category);break;case QtCriticalMsg:fprintf(stderr, "Critical: %s (%s:%u, %s  %s)\n", localMsg.constData(), file, context.line, function, context.category);break;case QtFatalMsg:fprintf(stderr, "Fatal: %s (%s:%u, %s  %s)\n", localMsg.constData(), file, context.line, function, context.category);break;}
}void myMessageOutputForPure(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QByteArray localMsg = msg.toLocal8Bit();QFile file(g_fileName);if(file.open(QIODevice::Append)) {file.write(localMsg + "\n\n");file.close();}
}void myMessageOutputForQtConsole(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QByteArray localMsg = msg.toLocal8Bit();QFile file(g_fileName);if(file.open(QIODevice::Append)) {file.write(localMsg + "\n\n");file.close();}
}void myMessageOutputForFile(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QFile file(g_fileName);if(file.open(QIODevice::Append)) {file.write(qFormatLogMessage(type, context, msg).toLocal8Bit() + "\n\n");file.close();}
}

mainwindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:/*** @brief on_btnQDebug_clicked 调试信息*/void on_btnQDebug_clicked();/*** @brief on_btnQInfo_clicked 普通信息*/void on_btnQInfo_clicked();/*** @brief on_btnQWarning_clicked 一般警告*/void on_btnQWarning_clicked();/*** @brief on_btnQCritical_clicked 严重错误*/void on_btnQCritical_clicked();/*** @brief on_btnQFatal_clicked 致命错误*/void on_btnQFatal_clicked();/*** @brief on_btnCancelOutputFile_clicked取消输出文件*/void on_btnCancelOutputFile_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>
#include <QElapsedTimer>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnQDebug_clicked()
{static int cntFlag = 0;qDebug() << u8"调试信息输出 qDebug" << ++cntFlag;
}void MainWindow::on_btnQInfo_clicked()
{static int cntFlag = 0;qInfo() << u8"普通信息输出 qInfo" << ++cntFlag;
}void MainWindow::on_btnQWarning_clicked()
{static int cntFlag = 0;qWarning() << u8"一般警告输出 qWarning" << ++cntFlag;
}void MainWindow::on_btnQCritical_clicked()
{static int cntFlag = 0;qCritical() << u8"严重错误输出 qCritical" << ++cntFlag;
}void MainWindow::on_btnQFatal_clicked()
{static int cntFlag = 0;qFatal(QString(u8"致命错误输出 qFatal %1").arg(++cntFlag).toStdString().data() ) ;
}void MainWindow::on_btnCancelOutputFile_clicked()
{qInstallMessageHandler(Q_NULLPTR);ui->btnCancelOutputFile->setEnabled(false);
}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>283</width><height>146</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><layout class="QVBoxLayout" name="verticalLayout"><item><widget class="QPushButton" name="btnCancelOutputFile"><property name="text"><string>取消输出输出日志</string></property></widget></item><item><layout class="QGridLayout" name="gridLayout"><item row="0" column="0"><spacer name="horizontalSpacer"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>31</width><height>20</height></size></property></spacer></item><item row="0" column="1" colspan="2"><widget class="QPushButton" name="btnQDebug"><property name="text"><string>QDebug</string></property></widget></item><item row="0" column="3" colspan="2"><widget class="QPushButton" name="btnQInfo"><property name="text"><string>QInfo</string></property></widget></item><item row="0" column="5"><spacer name="horizontalSpacer_2"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>32</width><height>20</height></size></property></spacer></item><item row="1" column="0" colspan="2"><widget class="QPushButton" name="btnQWarning"><property name="text"><string>QWarning</string></property></widget></item><item row="1" column="2" colspan="2"><widget class="QPushButton" name="btnQCritical"><property name="text"><string>QCritical</string></property></widget></item><item row="1" column="4" colspan="2"><widget class="QPushButton" name="btnQFatal"><property name="text"><string>QFatal</string></property></widget></item></layout></item></layout></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>283</width><height>23</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

这篇关于Qt之QDebug日志输出(含源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/957253

相关文章

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j