第一步:通过QLoggingCategory 类进行日志的输出
只说明了一种方式,其他方式可查看QLoggingCategory 说明文档。
第一步设置完成,可以在控制台输出窗口查看到qCDebug的输出信息。
- 1.1 声明与创建QLoggingCategory
//在头文件中添加声明testlog对象
Q_DECLARE_LOGGING_CATEGORY(testlog)
//在对应的cpp文件中添加testlog的定义,可配置文件为testlog.log,第3个参数没传,表示所有QtMsgType类型都支持输出
//QtMsgType包括:QtDebugMsg,QtWarningMsg等
Q_LOGGING_CATEGORY(testlog, "testlog.log")
- 1.2 配置规则
配置规则的格式:
<category>[.<type>] = true|false
怎么确定对应的哪个模块,查看对应日志信息,如 :qCDebug(lcQpaMime) << FUNCTION 中,qCDebug的第一个参数的定义,就是模块的名称
Q_LOGGING_CATEGORY(lcQpaWindows, “qt.qpa.windows”)
Q_LOGGING_CATEGORY(lcQpaBackingStore, “qt.qpa.backingstore”)
Q_LOGGING_CATEGORY(lcQpaEvents, “qt.qpa.events”)
Q_LOGGING_CATEGORY(lcQpaGl, “qt.qpa.gl”)
Q_LOGGING_CATEGORY(lcQpaMime, “qt.qpa.mime”) //对应这个
Q_LOGGING_CATEGORY(lcQpaInputMethods, “qt.qpa.input.methods”)
Q_LOGGING_CATEGORY(lcQpaDialogs, “qt.qpa.dialogs”)
Q_LOGGING_CATEGORY(lcQpaTablet, “qt.qpa.input.tablet”)
Q_LOGGING_CATEGORY(lcQpaAccessibility, “qt.qpa.accessibility”)
配置规则有多种方法,其中一种方式是用setFilterRules函数。
其他方式可查看QLoggingCategory 的说明文档
//设置qt.qpa.mime模块的debug类型输出,这个模块的QCDebug信息输出
QLoggingCategory::setFilterRules("qt.qpa.mime.debug=true");
第二步:把调试信息输出到日志文件
添加完第二步,调试信息输出到对应的日志文件,控制台输出窗口不再输出调试信息。
- 2.1 输出日志文档的函数
//声明一个全局的日志文件路径
QString sPath = "D:/QDebug" + QString(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss").append("-log.ini"));
//日志文件输出函数。这个函数也可以拆为两个,把加锁去掉,把写入文件的操作单独放到一个线程中。
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 加锁
static QMutex mutex;
mutex.lock();
QByteArray localMsg = msg.toLocal8Bit();
QString text;
switch (type) {
case QtDebugMsg:
text = QString("Debug: ");
break;
case QtWarningMsg:
text = QString("Warning: ");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal: ");
break;
default:
text = QString("Debug: ");
}
// 设置输出信息格式
QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line); // F文件L行数
QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString strMessage = QString("%1 %2 \t%3 \t%4").arg(text).arg(context_info).arg(strDateTime).arg(msg);
// 输出信息至文件中(读写、追加形式)
QFile file(sPath);
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close();
// 解锁
mutex.unlock();
}
- 2.2 注册
//程序开始时进行注册
qInstallMessageHandler(outputMessage);
第三:完整版
//.h
Q_DECLARE_LOGGING_CATEGORY(testlog)
//.cpp
Q_LOGGING_CATEGORY(testlog, "testlog.log")
//main
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
//函数实现在上边
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLoggingCategory::setFilterRules("qt.qpa.mime.debug=true");
qInstallMessageHandler(outputMessage);
dialog w;
w.show();
return a.exec();
}
1197

被折叠的 条评论
为什么被折叠?



