qDebug默认输出字符串+换行
想要输出文件名,函数名,行号需要自定义,
如下是输出到文件,并且打印到控制台
//自定义消息处理函数
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QDateTime time = QDateTime::currentDateTime();
QString strTime = time.toString("yyyy-MM-dd hh:mm:ss.zzz");
QString strMessage = QString("[%1] %2 (%3) %4")
.arg(strTime).arg(context.file).arg(context.line).arg(context.function);
QString strMsg;
switch(type)
{
case QtDebugMsg:
strMsg = QString(" [Debug] ");
break;
case QtInfoMsg:
strMsg = QString(" [Info] ");
break;
case QtWarningMsg:
strMsg = QString(" [Warning] ");
break;
case QtCriticalMsg:
strMsg = QString(" [Critical] ");
break;
case QtFatalMsg:
strMsg = QString(" [Fatal] ");
break;
default:
strMsg = QString(" [Err]");
break;
}
strMessage = strMessage + strMsg + msg;
if(type>QtDebugMsg)
{
//加锁输出文件
static QMutex mutex;
mutex.lock();
QFile file(".\\test.log");
file.open(QIODevice::WriteOnly|QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close();
mutex.unlock();
}
//同时用系统原来的函数完成输出打印
FILE* device = stdout;
if(type>QtInfoMsg)
{
device = stderr;
}
QTextStream outputStream(device);
outputStream.setCodec(QTextCodec::codecForName("System"));
outputStream<<strMessage.toLocal8Bit();
outputStream.flush();
}
注意:打印到控制台如果有中文,可能会乱码,所以一定要加上
outputStream.setCodec(QTextCodec::codecForName("System"));
不写system的话写GBK也可以的,但是System看起来伟大一点,
用法:main函数中调用
qInstallMessageHandler(myMessageOutput);
需要引用
#include <QTextCodec>
#include <QtDebug>
#include <QMutex>
。。。。