Qt日志 qInstallMessageHandler qt消息处理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值