qt的日志输出有 QMessageLogger、QDebug、QLoggingCategory三个类进行操作,qDebug 和qCDebug是为便捷使用那三个类对象而进行的宏包装。
另外qt还为外界提供 qt_message_output() 进行日志输出,以及qInstallMessageHandler进行输出控制操作。
一、QMessageLogger、QDebug、qDebug()、qt_message_output()
qt日志输出简单案例:
#include "qloggingcategory.h"
#include <QDebug>
int main()
{
char buffer[]="this is the message";
//方式1。通过qDebug()宏输出
qDebug()<<buffer<<endl; //按C++的cout的样式输出信息。
qDebug("%s",buffer); //按C语言的printf()的样式输出信息。
//方式2。通过QMessageLogger输出
QMessageLogger logger(__FILE__,__LINE__,__FUNCTION__,"gg");
logger.debug(buffer);//QtDebugMsg类型
logger.info(buffer);//QtInfoMsg类型
//方式3,通过QDebug输出
{QDebug dbg=logger.debug();dbg<<buffer;}
//方式4。通过qt_message_output进行输出
qt_message_output(QtMsgType::QtDebugMsg,QMessageLogContext(__FILE__,__LINE__,
__FUNCTION__,"gg"),buffer);
return 0;
}
qt默认输出是如何输出到 应用程序输出面板 (application output panel)
qt中,拥有专用的打印调试信息的QDebug类和QMessageLogger类,QMessageLogger是主要进行打印和对打印信息进行格式化编排的类。QDebug则为QMessageLogger提供类似cout样式的标准化输出操作。QDebug还可以用于向文件、字符串中进行流式输入的操作。
qt为QMessageLogger类对象做了宏定义qDebug()包装,使得使用起来与C++中cout标准输入输出的用法一致,极为方便。
qDebug() 、QDebug对象、QMessageLogger对象,默认会输出到qt creator 的 应用程序输出面板 (application output panel)
通过调试可知,qt中所有最终处理调试信息输出的方法都在qt源码的qlogging.cpp 文件中的qt_message_print()函数。比如QDebug对象在析构的时候就会调用其中的qt_message_output()函数 。
//D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\io\qdebug.cpp
QDebug::~QDebug()
{
if (!--stream->ref) {
if (stream->space && stream->buffer.endsWith(QLatin1Char(' ')))
stream->buffer.chop(1);
if (stream->message_output) {
qt_message_output(stream->type,
stream->context,
stream->buffer);
}
delete stream;
}
}
--------------------------------------
//D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\global\qlogging.h
void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const QString &message)
qt在windows下qt_message_print()中最后会调用到windows的Api 函数:OutputDebugString().,这个函数会将字符串输出到 qt ide的 应用程序输出面板(application output panel ) 上。
如果开启了控制台窗口,可以通过设置qt环境变量QT_FORCE_STDERR_LOGGING值为1,可以强制内容输出到stderr上,也就是输出到控制台窗口上。