我几天前开始使用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();
}
最佳答案
您的方法看起来简单而干净。我会这样保留。
您可以改进一件事:在应用程序启动时仅打开一次文件,在关闭应用程序时将其关闭。打开文件是一项昂贵的操作。
您可以从多个线程中写入同一打开文件,因为互斥锁可确保只有一个线程在同一时间写入。