根据qlogging.h
#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug
但是当我像这样使用时,文件,行,功能名称都没有显示。
qDebug()<< "abc"; // only show abc;
qDebug()<< ""; // show nothing;
我搜索了一会儿,似乎没有人像我上面那样有问题。
我使用ubuntu14.04,g ++版本4.8.2,从git构建qt5.3。
答案 0 :(得分:17)
您可以从默认输出格式重新格式化。 该功能在Qt 5.0中引入。
由于默认消息模式为“%{if-category}%{category}:%{endif}%{message}”,因此不会输出行号。此格式表示默认输出格式不包括行号或文件名等元数据。
%cat logtest.pro
TEMPLATE = app
TARGET = logtest
mac:CONFIG-=app_bundle
SOURCES += main.cpp
%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;
}
%qmake&amp;&amp;使强>
%。/ logtest
main.cpp(8): my output
您也可以使用QT_MESSAGE_PATTERN环境变量来设置消息模式,而无需调用qSetMessagePattern()。
请参阅其他占位符的参考。 http://qt-project.org/doc/qt-5/qtglobal.html#qSetMessagePattern
答案 1 :(得分:11)
如果您深入了解Qt历史记录,您可以发现自2014年10月1日起仅在调试版本中记录__FILE__
和__FUNCTION__
.git commit hash是d78fb442d750b33afe2e41f31588ec94cf4023ad。提交消息指出:
日志记录:禁用跟踪发布版本的调试源信息
跟踪文件,行,功能意味着必须有信息 存储在二进制文件中,扩大了大小。它也可能是一个 一些商业客户对他们的内部文件&amp; 函数名称'泄露'。因此我们为调试版本启用它 仅
答案 2 :(得分:5)
以下是如何在使用QMessageLogContext安装的自定义消息处理程序中使用捕获的qInstallMessageHandler数据的简单示例。我没有输出category
或version
成员,因为它们似乎没用。如果需要,您也可以通过这种方式登录文件。
#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;
}
答案 3 :(得分:2)
您可以使用标准C ++ __LINE__
和__FILE__
。另外,请查看What's the difference between __PRETTY_FUNCTION__
, __FUNCTION__
, __func__
SO question。如果使用GCC,则可以编写__PRETTY_FUNCTION__
以获取有关代码执行位置的函数的信息。只需准备你喜欢的debug-define。
例如,这是一个小的可编译应用程序:
#include <QApplication>
#include <QDebug>
#include <iostream>
// Qt-way
#define MyDBG (qDebug()<<__FILE__<<__LINE__<<__PRETTY_FUNCTION__)
// GCC
#define MyStdDBG (std::cout<< __FILE__<<":"<<__LINE__<<" in "<<__PRETTY_FUNCTION__<<std::endl)
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Qt-way
MyDBG;
MyDBG << "Something happened!";
// GCC
MyStdDBG;
return a.exec();
}
它提供下一个输出:
../path/main.cpp 14 int main(int, char**)
../path/main.cpp 15 int main(int, char**) Something happened!
../path/main.cpp:18 in int main(int, char**)
UPD:添加了纯C ++ - 输出方式。
答案 4 :(得分:1)
我认为您需要定义:
#define qDebug() QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()
并将其用作
qDebug() << "abc";
或
#define qDebug QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()
并将其用作:
qDebug << "abc";
答案 5 :(得分:1)
根据文件qDebug() is already a macro to QMessageLogger()。默认消息处理程序仅将消息打印到stderr
。我想您可能想要使用qInstallMessageHandler()
to install your own message handler, that uses the context
编辑:
手册中有相关部分描述了此问题。在Qt4中,上下文变量未传递给已安装的消息处理程序,因此此解决方案仅为Qt5 +。默认消息处理程序不使用传入的上下文,但您可以轻松安装自己的,它只是一个函数指针。 There is even an example in the manual.
答案 6 :(得分:1)
这取决于您的Qt版本号,无论您是使用Qt的调试版本还是发布版本,以及您是否在应用程序中定制了Qt消息处理。
根据源代码“qlogging.cpp”编写的Qt 5.4文档:
QMessageLogger is used to generate messages for the Qt logging framework. Usually one uses
it through qDebug(), qWarning(), qCritical, or qFatal() functions,
which are actually macros: For example qDebug() expands to
QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO).debug()
for debug builds, and QMessageLogger(0, 0, 0).debug() for release builds.
因此,如果您在输出中没有看到文件,行和函数名称信息,很可能您使用的是Qt的发行版本。
如果您仍希望在输出中看到Qt的发布版本中的文件,行和函数名称信息,有几种方法可以实现它,正如之前的一些答案中所解释的那样。