Qt自定义打印日志信息,利用qInstallMessageHandler 进行重定向
官方文档
官方demo:
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
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();
}
自定义修改:
添加日志方法、代码行数、日期等保存到文件
#pragma region 日志
#define _TIME_ qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss:zzz"))//时间记录
QtMessageHandler gDefaultHandler = NULL;
void myLogput(QtMsgType type, const QMessageLogContext& context, const QString& msg) {
QString txt;
switch (type) {
//调试信息提示
case QtDebugMsg:
txt = QString("[Debug] [%1] [%2 : %3 : %4] : %5").arg(_TIME_).arg(context.file).arg(context.function).arg(context.line).arg(msg);
//保存日志格式为:时间: 文件名:日志行号:日志消息
break;
//一般的warning提示
case QtWarningMsg:
txt = QString("[Warning] [%1] [%2 : %3 : %4] : %5").arg(_TIME_).arg(context.file).arg(context.function).arg(context.line).arg(msg);
break;
//严重错误提示
case QtCriticalMsg:
txt = QString("[Critical] [%1] [%2 : %3 : %4] : %5").arg(_TIME_).arg(context.file).arg(context.function).arg(context.line).arg(msg);
break;
//致命错误提示
case QtFatalMsg:
txt = QString("[Fatal] [%1] [%2 : %3 : %4] : %5").arg(_TIME_).arg(context.file).arg(context.function).arg(context.line).arg(msg);
abort();
}
//QString strPath = "./log/log.log";
QString strPath = QDateTime::currentDateTime().toString("./log/log_yyyyMMdd.log");
QFile file(strPath);
if (file.size() >= 100 * 1024 * 1024)//如果日志文件超过100M,则另写一个
{
file.rename(strPath, QDateTime::currentDateTime().toString("./log/log_yyyyMMddhh.log"));
file.setFileName(strPath);
}
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream out(&file);
out << txt << endl;
//用系统原来的函数完成原来的功能. 比如输出到调试窗
if (gDefaultHandler)
{
gDefaultHandler(type, context, msg);
}
}
#pragma endregion
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//在其它地方调用qInstallMessageHandler设置新的输出函数,但保存原来的函数
gDefaultHandler = qInstallMessageHandler(myLogput);
//代码......
return a.exec();
}
打印日志信息:
问题
Release下的输出却没有文件信息、行数等信息,查看官方文档有解决办法。
解决方法:
1.在.pro文件定义一个宏
DEFINES += QT_MESSAGELOGCONTEXT
2.qt/vs
方法一:在代码中添加
#define QT_MESSAGELOGCONTEXT
方法二:在预处理定义中添加QT_MESSAGELOGCONTEXT
在这里写上这些,相当于在本工程所有的文件中都写上了:
#define QT_MESSAGELOGCONTEXT