函数作用:装之前定义的Qt消息处理程序;返回指向上一个消息处理程序的指针。
消息处理程序是一个打印调试消息、警告、关键和致命错误消息的函数。Qt库(调试模式)包含数百条警告消息,当出现内部错误(通常是无效的函数参数)时会打印这些消息。Qt内置发布模式也包含此类警告,除非编译期间设置了Qt_NO_WARNING_输出和/或Qt_NO_DEBUG_输出。如果实现自己的消息处理程序,则可以完全控制这些消息。
默认消息处理程序将消息打印到X11下的标准输出或Windows下的调试器。如果是致命消息,应用程序将立即中止。
只能定义一个消息处理程序,因为这通常是在应用程序范围内进行的,以控制调试输出。
要还原消息处理程序,请调用qInstallMessageHandler(0)。
#include#include #include void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); const char *file = context.file ? context.file : ""; const char *function = context.function ? context.function : ""; switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); break; case QtInfoMsg: fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); break; case QtWarningMsg: fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); break; } } int main(int argc, char **argv) { qInstallMessageHandler(myMessageOutput); QApplication app(argc, argv); ... return app.exec(); }
See also QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(), and Debugging Techniques.
/**
* @brief customMessageHandler,日志重定向句柄
* @param type 日志类型,debug等
* @param context 上下文
* @param msg 日志信息
*/
void Utils::customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
QByteArray localMsg = msg.toLocal8Bit();
QString strMsg("");
switch (type) {
case QtDebugMsg:
strMsg = QString("[Debug]");
break;
case QtWarningMsg:
strMsg = QString("[Warning]");
break;
case QtCriticalMsg:
strMsg = QString("[Critical]");
break;
case QtFatalMsg:
strMsg = QString("[Fatal]");
break;
default:
strMsg = QString("[Debug]");
break;
}
// 设置输出信息格式
QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString strMessage = strMsg + QString("DateTime:%1 ThreadId:%2 Message:%3 File:%4(%5)")
.arg(strDateTime).arg(QString::number(quintptr(QThread::currentThreadId()))).arg(localMsg.constData()).arg(context.file).arg(context.line);
std::cout << strMessage.toUtf8().data() << std::endl;
// 输出信息至文件中(读写、追加形式)
QString fileName = m_sysRootPath + PROC_LOG;
fileName.replace("//", "/");
QFile file(fileName);
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << endl;
stream.flush();
file.close();
}
QMessageLogger类生成日志消息。
QMessageLogger用于为Qt日志框架生成消息。通常通过qDebug()、qInfo()、qWarning()、qCritical()或qFatal()函数使用它,这些函数实际上是宏:例如qDebug()扩展为QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()用于调试和 QMessageLogger(0, 0, 0).debug()用于发布版本。
如果想要在调试版本和发布版本都有这些日志的话,可以用自定义的宏替换qDebug()等,如下:
#include
//输出debug级别日志
#define KyDebug QMessageLogger(__FILE__, __LINE__, __FUNCTION__).debug
//输出info级别日志
#define KyInfo QMessageLogger(__FILE__, __LINE__, __FUNCTION__).info
//输出warning级别日志
#define KyWarning QMessageLogger(__FILE__, __LINE__, __FUNCTION__).warning
//输出critical级别日志
#define KyCritical QMessageLogger(__FILE__, __LINE__, __FUNCTION__).critical
//输出fatal级别日志
#define KyFatal QMessageLogger(__FILE__, __LINE__, __FUNCTION__).fatal
可以结合qInstallMessageHandler一起使用,qInstallMessageHandler的参数QMessageLogContext &context中有__FILE__, __LINE__, __FUNCTION__的副本。