95

デバッグ出力に多くのqDebug() <<ステートメントを使用しています。シェルスクリプトを使用せずに、そのデバッグ出力をファイルにリダイレクトできるクロスプラットフォームの方法はありますか?open()とdup2 ()はLinuxで機能すると思いますが、WindowsでMinGWを使用してコンパイルすると機能しますか?

そして多分それをするQtの方法がありますか?

4

6 に答える 6

135

関数を使用してメッセージハンドラーをインストールする必要があります。qInstallMsgHandlerその後、を使用してデバッグメッセージをファイルQTextStreamに書き込むことができます。サンプル例を次に示します。

#include <QtGlobal>
#include <stdio.h>
#include <stdlib.h>

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %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(myMessageOutput); // Install the handler
    QApplication app(argc, argv);
    ...
    return app.exec();
}

qInstallMsgHandler(コメントを追加しただけです)のドキュメントから引用:

上記の例では、関数myMessageOutputstderrこれを使用して、他のファイルストリームに置き換えたり、関数を完全に書き直したりすることができます。

この関数を作成してインストールすると、すべてのqDebug(およびなどqWarningqCritical)メッセージがハンドラーで書き込みを行っているファイルにリダイレクトされます。

于 2011-02-10T06:48:57.327 に答える
24

ここからすべてのクレジットは精神に行きます。

#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>

void myMessageHandler(QtMsgType type, const QMessageLogContext &, const QString & msg)
{
    QString txt;
    switch (type) {
    case QtDebugMsg:
        txt = QString("Debug: %1").arg(msg);
        break;
    case QtWarningMsg:
        txt = QString("Warning: %1").arg(msg);
        break;
    case QtCriticalMsg:
        txt = QString("Critical: %1").arg(msg);
        break;
    case QtFatalMsg:
        txt = QString("Fatal: %1").arg(msg);
        abort();
    }
    QFile outFile("log");
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&outFile);
    ts << txt << endl;
}

int main( int argc, char * argv[] )
{
    QApplication app( argc, argv );
    qInstallMessageHandler(myMessageHandler);   
    ...
    return app.exec();
}
于 2012-06-26T06:52:46.823 に答える
6

そうですね、デバッグ出力を stderr 以外のものにリダイレクトする必要があるのは、何らかのロギング ツールについて考えるときです。必要な場合は、ライブラリからQxtLogger( 「QxtLogger クラスは使いやすく、拡張しやすいロギング ツールです。」 )を使用することをお勧めしQxtます。

于 2011-02-10T19:27:22.300 に答える