Qt调试详细日志文件输出

这篇具有很好参考价值的文章主要介绍了Qt调试详细日志文件输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qInstallMessageHandle安装消息,注册回调函数,对qDebug()、qWarning()、qCritial()、qInfo()、qFatal() 等函数输出信息重定向处理。

注明:以下方法仅适用于 Qt5 及以上版本

目的:生成log.txt日志文件,记录详细日志信息(包括等级、所在文件、所在行号、描述信息、产生时间等),以便于快速跟踪、定位。那么在qt createor的应用程序输出窗口就不会有调试信息显示。

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

qInstallMessageHandler安装写在main()方法中,这样全局所有类的qDebug都可以将信息直接打印到日志文件中即安装了消息处理)。如果想恢复消息处理程序,调用qInstallMessageHandler(0)。

QtMessageHandler 回调函数处理日志信息,包括等级、所在文件、所在行号、描述信息、产生时间并保存到本地文件。

其中等级:

qDebug: 调试信息

qWarning:警告信息

qCritical: 严重错误

qFatal: 致命错误

#ifndef LOGGINGOUTPUT_H
#define LOGGINGOUTPUT_H

#include <QObject>
#include <QApplication>
#include <QDir>
#include <QMutex>
#include <QDateTime>
#include <QTextStream>
#include <QFile>


const int LOG_OPERATE_OK = 100; //操作成功
const int LOG_OPENFILE_FAILED = 101; //打开文件失败


class QLogOutput : public QObject
{
    Q_OBJECT
public:
    explicit QLogOutput(QObject *parent = nullptr);

    //安装信息处理函数
    static void install(QString strLogFile);

    //卸载信息处理函数
    static void uninstall();

private:
    //日志信息处理函数
    static void outPutMsg(QtMsgType msgType, const QMessageLogContext &context, const QString &strText);

     //保存日志
    static int SaveLog(const QString &strMsg);

    //保存日志路径
    static QString m_strLogFile;

};


#endif // LOGGINGOUTPUT_H
#include "loggingoutput.h"

QString  QLogOutput::m_strLogFile = "";

QLogOutput::QLogOutput(QObject *parent) : QObject(parent)
{

}

void QLogOutput::outPutMsg(QtMsgType msgType, const QMessageLogContext &context, const QString &strText)
{
    static QMutex mutex;
    mutex.lock();

    QByteArray localMsg = strText.toLocal8Bit();

    QString strMsg("");
    QString strMessage;
    // 设置输出信息格式
    QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

    switch(msgType)
    {
    case QtDebugMsg:
    {
        strMsg = QString("Debug:");
         strMessage = QString("[%1] %5 %6\t--File:%2  Line:%3  Function:%4  ")
                .arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);
    }
        break;
    case QtInfoMsg:
    {
         strMsg = QString("Info:");
         strMessage = QString("[%1] %2 %3\t").arg(strDateTime).arg(strMsg).arg(strText);
    }
        break;
    case QtWarningMsg:
    {
        strMsg = QString("Warning:");
        strMessage = QString("[%1] %5 %6\t--File:%2  Line:%3  Function:%4  ")
               .arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);
    }
        break;
    case QtCriticalMsg:
    {
        strMsg = QString("Critical:");
        strMessage = QString("[%1] %5 %6\t--File:%2  Line:%3  Function:%4  ")
               .arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);
    }
        break;
    case QtFatalMsg:
    {
        strMsg = QString("Fatal:");
        strMessage = QString("[%1] %5 %6\t--File:%2  Line:%3  Function:%4  ")
               .arg(strDateTime).arg(context.file).arg(context.line).arg(context.function).arg(strMsg).arg(strText);
    }
        break;
    }

    SaveLog(strMessage);

    // 解锁
    mutex.unlock();

}

void QLogOutput::install(QString strLogFile)
{
    qInstallMessageHandler(outPutMsg);
    QString log_dir = strLogFile+"/log";
    QDir dir(log_dir);
    if(!dir.exists())
    {
        //创建在可执行程序所在目录创建log文件
        dir.mkdir(log_dir);
    }
    m_strLogFile = log_dir;
}

void QLogOutput::uninstall()
{
    qInstallMessageHandler(0);
}

int QLogOutput::SaveLog(const QString& strMsg)
{
    QString log_fileName;
    QDateTime current_date_time =QDateTime::currentDateTime();
    QString date = current_date_time.toString("yyyy-MM-dd");
    log_fileName = m_strLogFile +"/"+"log_"+date+".txt";
    // 输出信息至文件中(读写、追加形式)
    QFile file(log_fileName);
    bool bOpen = file.open(QIODevice::ReadWrite | QIODevice::Append);
    if(!bOpen)
        return  LOG_OPENFILE_FAILED;
    QTextStream stream(&file);
    stream << strMsg << "\r\n";
    file.flush();
    file.close();
    return  LOG_OPERATE_OK;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString strLogFile = QCoreApplication::applicationDirPath();
    QLogOutput::install(strLogFile);

    qDebug("This is a 调试 message.");
    qInfo("This is a info message.");

    Dialog w;
    w.show();
    return a.exec();
}

在vs2017 msvc + qt 的环境下,防止中文乱码,在pro文件配置

msvc{
QMAKE_CXXFLAGS += -utf-8
}文章来源地址https://www.toymoban.com/news/detail-491405.html

到了这里,关于Qt调试详细日志文件输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

    原文链接:https://blog.csdn.net/gongjianbo1992/article/details/108030391 相对于第三方的日志库,在 Qt 中使用 QDebug 打印更便捷,有时候也需要对 QDebug 输出进行重定向,如写入文件等。 在 Qt4 中使用 qInstallMsgHandler 函数设置重定向的函数指针: 在 Qt5 中应该使用 qInstallMessageHandler 来注册函

    2024年02月08日
    浏览(34)
  • python日志输出详细讲解版

    一个成熟的软件产品,日志是必不可少的一部分,在python中我们怎么实现产品级别的日志输出呢? python有一个内置模块logging,用来输出日志信息,可以进行各种配置,能满足我们大部分场景对日志的需求。 导入logging模块,直接输出5个级别的日志信息,我们看一下会输出什

    2023年04月08日
    浏览(24)
  • SpringBoot设置日志输出级别及Logback日志工具输出到文件

    1.SpringBoot设置日志输出级别 越高包含的就越多,输出的信息也就越多 2.Logback日志工具使用 1.首先需要把你yaml文件里面关于日志的配置去掉,避免冲突报错 2.在resource目录下创建logback-spring.xml文件 2.运行后指定路径就会生成.log文件 3.此时一般默认只有info信息写入,其他两个

    2024年02月16日
    浏览(48)
  • SpringBoot【日志文件的打印与输出】

    ⽇志是程序的重要组成部分它在我们运行检查程序时用来 发现和定位问题 除了发现和定位问题之外,我们还可以通过⽇志实现以下功能: ● 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户 ● 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈ ● 记录程序的

    2024年02月04日
    浏览(58)
  • nohup 输出到指定文件 Linux nohup 实现命令后台运行并输出或记录到指定日志文件 设置日志结果文件名称 重定向到某个文件 标准误 标准错误输出定向 输入报错信息保留

    # yourcommand:启动对象命令。可以跟该命令需要的各种参数。 # 是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出. nohup与结合起来,可以实现不挂断的后台运行。 实现屏幕输出记录到日志文件 # 0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standa

    2024年02月05日
    浏览(50)
  • logback日志按照类型输出到不同文件

    公司要将项目的日志分为不同的类别,如所有日志、请求日志、错误日志和 SQL 日志。 目前使用的日志框架为slf4j + logback。 要将日志分为不同的类别,可以使用 Logback 的日志级别和过滤器来实现。 然后,可以针对特定的日志类型设置不同的日志级别和过滤器。 Logback 的appe

    2024年02月16日
    浏览(29)
  • docker_查询日志并输出到文件

    想查询一下docker容器内服务的log,但是因为log太多,想自定义筛选一下。 1、导出全部的log到文件 2、按照时间导出log信息 但是全部的log太多,我想按照时间进行查询,这就用到了--since参数 --since参数的含义是,显示某个时间点后的log信息,也可以是相对于现在多长时间的l

    2024年02月01日
    浏览(27)
  • java Logback输出日志内容到文件

    1.首先,在您的项目中添加Logback依赖,例如在Maven项目中的pom.xml文件中添加以下代码: 2.接下来,创建一个Logback配置文件,比如命名为logback.xml,并将其放置在类路径下(src/main/resources/目录)。 3.上述配置将日志输出到名为application.log的文件中。您可以根据需要更改文件名、

    2024年02月09日
    浏览(26)
  • 超轻量级的c#版基于文件的日志记录工具,可定制输出格式,可指定日志文件

    这是我自己个人编写的日志记录,主要使用在只需要记录日志,偶尔到文件中查看一下日志记录的情况。我自己写的一些服务之类的是使用了这个的,代码很少,使用很简单。 搜索和安装zmjtool这个包,我写的,如下图:  

    2024年03月15日
    浏览(50)
  • pytest pytest.ini 配置日志输出至文件

     创建pytest.ini 文件       

    2024年02月10日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包