实现过程中找了些参考,但都不是很全/清楚,还是踩了些坑才实现的,因此发文记录下
一、源代码
参考代码很多,一搜就有,贴一份测试代码:
#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 版权协议,转载请附上原文出处链接和本声明。