- 引言
在应用程序当中添加日志代码,让开发者在应用出错的时候,通过应用日志快速定位问题所在。但是开发自己的日志类需要耗费时间,使用现成的日志类又需要时间熟悉使用方法。 - 解决方案
Qt5.0可以通过调用qInstallMessageHandler来自定义日志处理函数,从而达到记录日志的目的。函数签名如下:
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
其中handler为新的日志处理函数,函数返回值为之前日志处理函数的指针,调用qInstallMessageHandler(0)来恢复默认日志处理函数。 示例代码
FILE* logFile = 0;
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg)
{
QString file = ctxt.file;
QString path = QString(FILE);
path = path.left(path.lastIndexOf(‘/’) + 1);
if (file.startsWith(path))
{
file = file.mid(path.length());
}
QTime time = QDateTime::currentDateTime().toUTC().time();
QString LogMsg = QString(“[%1 UTC] %2:%3 : “).arg(time.toString(“HH:mm:ss.zzz”)).arg(file).arg(ctxt.line);
switch (type)
{
case QtDebugMsg:
LogMsg += “Debug”;
break;
case QtWarningMsg:
LogMsg += “Warning”;
break;
case QtCriticalMsg:
LogMsg += “Critical”;
break;
case QtFatalMsg:
LogMsg += “Fatal”;
break;
default:
break;
}
LogMsg += “: ” + msg + “\n”;
QByteArray LogMsgBytes = LogMsg.toUtf8();
fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr);
if (logFile )
{
fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFile );
fflush(logFile );
}
}
int main(int argc, char *argv[])
{
qInstallMessageHandler(logMessageHandler);
QApplication a(argc, argv);
QString logfile = QDir::currentPath() + “\Tutorial.log”;
logFile = fopen(logfile.toLocal8Bit().constData(), “a”);
MainWindow w;
qDebug()<<”测试”;
w.show();
return a.exec();
}