我几天前开始使用Qt5。我的应用程序需要一个记录器,因此决定使用qDebug,但似乎必须“重定向”才能将日志保存在文件中。

我使用qInstallMessageHandler做到了这一点,并编写了自己的处理程序,如下所示(从此处的其他人那里得到启发)。

看来它可行,但是由于我不是专家,所以我不得不问:
是否可以在多线程应用程序中使用它?

另外,如果可以在多线程应用程序中使用它,可以在某种程度上加以改进吗?

void MessageHandler(QtMsgType type, const QMessageLogContext & context, const QString & msg)
{
    mutex.lock();

    QDateTime dateTime(QDateTime::currentDateTime());

    QString timeStr(dateTime.toString("dd-MM-yyyy HH:mm:ss:zzz"));
    QString contextString(QString("(%1, %2)").arg(context.file).arg(context.line));

    QFile outFile("file.log");
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);

    QTextStream stream(&outFile);
    stream << timeStr << " " << contextString << ": " << msg << endl;

    mutex.unlock();
}

最佳答案

您的方法看起来简单而干净。我会这样保留。

您可以改进一件事:在应用程序启动时仅打开一次文件,在关闭应用程序时将其关闭。打开文件是一项昂贵的操作。

您可以从多个线程中写入同一打开文件,因为互斥锁可确保只有一个线程在同一时间写入。

10-05 21:16
查看更多