Qt工作笔记-自定义打印及存日志及stderr转stdout(Linux程序调试技巧,提高开发效率)

如下的代码:

#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <stdio.h>
#include <QDebug>
using namespace std;


int main(int argc, char *argv[])
{
    cout << "The std cout output msg" << endl;
    qDebug() << "The qDebug output msg";
    qInfo() << "The qInfo output msg";
    qWarning() << "The qWarning output msg";
    qCritical() << "The qCritical output msg";

    qFatal("The qFatal output msg");
    return 0;
}

在Linux中程序有2个关键,一个是标准输出,一个是标准错误,在C语言中,有stderr和stdout。

 

程序运行截图如下:

如果把标准输出重定向到1.txt文件中:那么屏幕就只会输出stderr

然后把标准错误放到标准输出上这样屏幕就不会打印东西了:

所有的数据都将在1.txt中:

下面来说下这个的作用,本人在搞开发的时候,经常改别人的程序,或者在xx程序中进行二次开发,这样的话就有个问题,大量的打印。

当别人程序里面只有cout作为输出的时候,

自己可以使用qDebug()进行打印,然后把标准输出重定向,这样标准错误就会打印到屏幕上了。

 

下面问题来了,当那个项目里面又有人cout、qDebug这样改怎么搞,下面提供3个解决思路。

第一个,将qDebug改为stdout,自己使用qInfo或其他几个进行输出。然后就和上面一样了,代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <stdio.h>
#include <QDebug>
using namespace std;

void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){

    QByteArray localMsg = msg.toLocal8Bit();

    switch(type){

    case QtDebugMsg:
        fprintf(stdout, "qDebug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        abort();
    }
}


int main(int argc, char *argv[])
{

    qInstallMessageHandler(messageOutput);

    cout << "The std cout output msg" << endl;
    qDebug() << "The qDebug output msg";
    qInfo() << "The qInfo output msg";
    qWarning() << "The qWarning output msg";
    qCritical() << "The qCritical output msg";

    qFatal("The qFatal output msg");
    return 0;
}

程序运行截图如下:

这种方式是不是很有用

 

第二种就不演示了,就提一下。把QtDebugMsg中不提供打印,然后自己用其他几个输出。

 

第三个:记录到文件中,这里可以加个当前时间,这样就和日志一样了,比如自己用Warning记录到文件里面:

程序源码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <iostream>
#include <QDateTime>
#include <QTextStream>
#include <stdio.h>
#include <QDebug>
#include <QFile>
using namespace std;

void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){

    QByteArray localMsg = msg.toLocal8Bit();

    switch(type){

    case QtDebugMsg:
        fprintf(stdout, "qDebug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtWarningMsg:
        {
            QFile file("myOut.txt");
            if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){

                break;
            }
            QTextStream out(&file);
            out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") <<localMsg << "\n";
            file.close();
        }
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
        abort();
    }
}


int main(int argc, char *argv[])
{
    qInstallMessageHandler(messageOutput);
    cout << "The std cout output msg" << endl;
    qDebug() << "The qDebug output msg";
    qInfo() << "The qInfo output msg";
    qWarning() << "The qWarning output msg";
    qCritical() << "The qCritical output msg";

    qFatal("The qFatal output msg");

    return 0;
}

程序运行截图如下:

相应的文件:

是不是改别人代码的时候好调试多了。

原创文章 1362 获赞 2万+ 访问量 655万+

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/105834560