在Qt中,可以使用QLoggingCategory类来实现日志功能。QLoggingCategory是一个Qt提供的简单易用的日志类,可以方便地实现不同级别、不同模块的日志输出,并且支持输出到文件、控制台等不同输出设备。
首先需要在头文件中包含
Q_LOGGING_CATEGORY(logTest, "test")
其中logTest是自定义的日志分类名称,”test”是该分类的描述信息。可以根据需要定义多个不同的日志分类。
接下来就可以在程序中使用qCDebug()、qCWarning()、qCCritical()等函数输出日志了:
qCDebug(logTest) << "debug message";
qCWarning(logTest) << "warning message";
qCCritical(logTest) << "critical message";
其中第一个参数表示所属的日志分类,后面跟着要输出的消息文本。如果需要将消息输出到文件或者其他设备上,则需要使用Qt提供的消息处理器(Message Handler)机制。
例如,在main函数中添加以下代码:
void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(stdout, "[DEBUG] %s\n", localMsg.constData());
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(customMessageHandler);
// ...
}
这样就可以将日志输出到控制台了。如果需要将日志输出到文件,可以使用QFile或QTextStream等类实现。例如:
void customMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
QFile file("mylog.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) {
return;
}
QTextStream out(&file);
out.setCodec("UTF-8");
switch (type) {
case QtDebugMsg:
out << QString("[DEBUG] %1\n").arg(msg);
break;
case QtWarningMsg:
out << QString("[WARNING] %1 (%2:%3,%4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function);
break;
case QtCriticalMsg:
out << QString("[CRITICAL] %1 (%2:%3,%4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function);
break;
case QtFatalMsg:
out << QString("[FATAL] %1 (%2:%3,%4)\n").arg(msg).arg(context.file).arg(context.line).arg(context.function);
abort();
}
}
这样就可以将日志输出到文件mylog.txt中了。