Vs2015 Qt项目(Release版)输出至log方法

  • Post author:
  • Post category:其他


实现过程中找了些参考,但都不是很全/清楚,还是踩了些坑才实现的,因此发文记录下



一、源代码

参考代码很多,一搜就有,贴一份测试代码:

#include "QtTestForLog.h"
#include <QtWidgets/QApplication>
//下面这4个inlcude系我Qt配置存在问题,故必须手动在属性配置路径后include
//可先不加,若贴入代码后发现“未识别的标识符QMutex”等报错再贴
#include"qmutex.h"
#include"qdatetime.h"
#include"qfile.h"
#include"qtextstream.h"


void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)//此函数实现功能即为将输出内容写入log文件
{
	static QMutex mutex;
	mutex.lock();

	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:");
	}

	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");//显示该语句输出时间 年-月-日 时:分:秒
	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);//指定log文件内的语句内容/格式

	QFile file("log.txt");//可修改文件名称
	file.open(QIODevice::WriteOnly | QIODevice::Append);
	QTextStream text_stream(&file);
	text_stream << message << "\r\n";
	file.flush();
	file.close();

	mutex.unlock();
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

	//注册MessageHandler,加此句则输出到log文件中;不加此句则输出到VS输出窗口
	qInstallMessageHandler(outputMessage);

	//测试打印日志到文件中
	qDebug("This is a debug message in main.cpp");
	qWarning("This is a warning message");
	qCritical("This is a critical message");
	qFatal("This is a fatal message");

    QtTestForLog w;
    w.show();
    return a.exec();
}



二、运行测试

反复测试得到项目文件夹下的log文件如下图所示:

在这里插入图片描述

由图所示,显示基本正常,但无法显示文件及行数信息

查询结果为:

Release 版本默认不包含这些信息:文件名、函数名、行数,需要在项目文件加入以下代码,加入后最好重新构建项目使之生效:

DEFINES += QT_MESSAGELOGCONTEXT

因此进行尝试



三、解决信息缺失问题



尝试1:

该语句一看即类似.pro文件语句,但由于VS里新建Qt项目不存在.pro文件,因此尝试给项目新建.pro文件并添加该语句,如下图所示;再重新生成,运行,好的,问题并没有解决…

在这里插入图片描述



尝试2:

摸索着在项目属性内找能放置该语句的位置进行尝试,经过反复查找后,找到可放置位置如下图所示;即

在项目属性—Qt Project Settings—qmake板块—Additional Project Settings一栏中添加:DEFINES += QT_MESSAGELOGCONTEXT


在这里插入图片描述

重新生成,运行,问题解决,文件内容如下:

在这里插入图片描述



版权声明:本文为weixin_45294823原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。