日志级别
- QtDebugMsg 对应 qDebug() 函数
- QtInfoMsg 对应 qInfo() 函数
- QtWarningMsg 对应 qWarning() 函数
- QtCriticalMsg 对应 qCritical() 函数
- QtFatalMsg 对应 qFatal() 函数
官方例子
在 QtCreator 中打开 Help->Index 输入 qInstallMessageHandler
查询
#include <qapplication.h>
#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);
QApplication app(argc, argv);
...
return app.exec();
}
重定义需求
我们需要将日志文件输出到固定的日志文件中去,在 Windows 平台下习惯放在程序当前目录下,在 Linux 平台下按惯例放置于 /var/log 目录下,以程序名命名,同时以 .log 结尾。
#include <QFile>
#include <QDebug>
#include <QDateTime>
#include <QTextStream>
#include <QMutexLocker>
#include <QtGlobal>
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
QMutexLocker locker(&mutex);
QString text;
switch(type) {
case QtDebugMsg:
text = QString("Debug:");
break;
case QtInfoMsg:
text = QString("Info:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
}
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
#if defined(_WIN32) || defined(_WIN64)
const char *eol = "\r\n";
const char *logfile = "app.log";
#else
const char *eol = "\n";
const char *logfile = "/var/log/app.log";
#endif
QFile file(logfile);
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << eol;
file.flush();
file.close();
}
int main(int argc, char *argv[])
{
qInstallMessageHandler(outputMessage);
QApplication a(argc, argv);
qDebug() << "This is a debug message";
qInfo() << "This is an info message";
qWarning() << "This is a warning message";
qCritical() << "This is a critical message";
// call qFatal() will cause app CRASHED
//qFatal("Now, This is an fatal error message");
return a.exec();
}
参考资料
[1] Qt之日志输出文件