デバッグ出力に多くのqDebug() <<
ステートメントを使用しています。シェルスクリプトを使用せずに、そのデバッグ出力をファイルにリダイレクトできるクロスプラットフォームの方法はありますか?open()とdup2 ()はLinuxで機能すると思いますが、WindowsでMinGWを使用してコンパイルすると機能しますか?
そして多分それをするQtの方法がありますか?
関数を使用してメッセージハンドラーをインストールする必要があります。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
(コメントを追加しただけです)のドキュメントから引用:
上記の例では、関数myMessageOutput
はstderr
これを使用して、他のファイルストリームに置き換えたり、関数を完全に書き直したりすることができます。
この関数を作成してインストールすると、すべてのqDebug
(およびなどqWarning
のqCritical
)メッセージがハンドラーで書き込みを行っているファイルにリダイレクトされます。
#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();
}
そうですね、デバッグ出力を stderr 以外のものにリダイレクトする必要があるのは、何らかのロギング ツールについて考えるときです。必要な場合は、ライブラリからQxtLogger
( 「QxtLogger クラスは使いやすく、拡張しやすいロギング ツールです。」 )を使用することをお勧めしQxt
ます。