根据qlogging.h
#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug
Run Code Online (Sandbox Code Playgroud)
但是当我使用这样的时候,文件,行,功能名称都没有显示出来.
qDebug()<< "abc"; // only show abc;
qDebug()<< ""; // show nothing;
Run Code Online (Sandbox Code Playgroud)
我搜索了一会儿,似乎没有人像我上面那样有问题.
我使用ubuntu14.04,g ++版本4.8.2,从git构建qt5.3.
use*_*041 17
您可以从默认输出格式重新格式化.该功能在Qt 5.0中引入.
行号未输出,因为默认消息模式为"%{if-category}%{category}:%{endif}%{message}".此格式表示默认输出格式不包括行号或文件名等元数据.
%cat logtest.pro
TEMPLATE = app
TARGET = logtest
mac:CONFIG-=app_bundle
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)
%cat main.cpp
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
qSetMessagePattern("%{file}(%{line}): %{message}");
QCoreApplication a(argc, argv);
qDebug() << "my output";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
%qmake && make
%./ logtest
main.cpp(8): my output
Run Code Online (Sandbox Code Playgroud)
您还可以使用QT_MESSAGE_PATTERN环境变量来设置消息模式,而无需调用qSetMessagePattern().
请参阅其他占位符的参考.http://qt-project.org/doc/qt-5/qtglobal.html#qSetMessagePattern
Uga*_*uga 12
如果您深入了解Qt历史记录,您可以发现自2014年10月1日以来仅在调试版本中记录__FILE__和使用__FUNCTION__.git commit hash是d78fb442d750b33afe2e41f31588ec94cf4023ad.提交消息指出:
日志记录:禁用跟踪发布版本的调试源信息
跟踪文件,行,函数意味着必须将信息存储在二进制文件中,从而扩大大小.一些商业客户可能会惊讶于他们的内部文件和功能名称被"泄露".因此,我们仅为调试版本启用它.
下面是一个简单示例,说明如何在使用qInstallMessageHandler安装的自定义消息处理程序中使用捕获的QMessageLogContext数据.我没有输出或成员因为它们似乎没用.如果需要,您也可以通过这种方式登录文件.categoryversion
#include <QDebug>
#include <QString>
#include <QDateTime>
#include <iostream>
void verboseMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static const char* typeStr[] = {"[ Debug]", "[ Warning]", "[Critical]", "[ Fatal]" };
if(type <= QtFatalMsg)
{
QByteArray localMsg = msg.toLocal8Bit();
QString contextString(QStringLiteral("(%1, %2, %3)")
.arg(context.file)
.arg(context.function)
.arg(context.line));
QString timeStr(QDateTime::currentDateTime().toString("dd-MM-yy HH:mm:ss:zzz"));
std::cerr << timeStr.toLocal8Bit().constData() << " - "
<< typeStr[type] << " "
<< contextString.toLocal8Bit().constData() << " "
<< localMsg.constData() << std::endl;
if(type == QtFatalMsg)
{
abort();
}
}
}
int main()
{
//Use default handler
qDebug() << "default handler";
qWarning() << "default handler";
qCritical() << "default handler";
//Install verbose handler
qInstallMessageHandler(verboseMessageHandler);
qDebug() << "verbose handler";
qWarning() << "verbose handler";
qCritical() << "verbose handler";
//Restore default handler
qInstallMessageHandler(0);
qDebug() << "default handler";
qWarning() << "default handler";
qCritical() << "default handler";
return 0;
}
Run Code Online (Sandbox Code Playgroud)