qdebug重定向到日志文件

一、QT的调试输出主要有以下几种:

    qDebug : 调试信息提示
    qWarning: 一般的警告提示
    qCritical: 严重错误提示

    qFatal: 致命错误提示


二、debug版的程序可以带着cmd窗口,供用户查看信息,但是release版本的时候不带cmd窗口,需要输出到日志中,但是程序中大量使用了qDebug,修改程序也比较麻烦,因此,可以在release版本的程序中,可以直接将qDebug重定向到日志文件中。经查询资料,整理出了log.h,只需要将其引用到工程中,在main.cpp中引入,使用的时候调用一下即可,具体如下:

log.h内容:

#ifndef LOG_H
#define LOG_H

#include <QFile>
#include <QTextStream>
#include <QDateTime>

//默认调试级别为warning,即小于warning级别的都不会写入日志文件
//只有release版本的时候,才会输出到日志,debug版本正常输出到终端。
namespace QT_LOG
{
	static int m_LogLevel = 1;
	static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss"));
	QMutex m_LogMutex;

	void customMessageHandler(QtMsgType type, const char *msg)
	{
		if (type < m_LogLevel)
		{
			return;
		}

		QString log_info;
		switch (type) 
		{
		case QtDebugMsg:
			log_info = QString("%1:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg);
			break;

		case QtWarningMsg:
			log_info = QString("%1[Warning]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg);
			break;

		case QtCriticalMsg:
			log_info = QString("%1[Critical]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg);
			break;

		case QtFatalMsg:
			log_info = QString("%1[Fatal]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg);
			abort();
		}

		m_LogMutex.lock();

		QFile outFile(m_LogFile);
		outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
		QTextStream ts(&outFile);
		ts << log_info << endl;
		outFile.close();

		m_LogMutex.unlock();
	}

	void logInit(QString logFile = "",int logLevel = 1)
	{
		#ifndef _DEBUG  
			if ((logLevel < 0) || (logLevel > 3))
			{
				m_LogLevel = 1;
			}
			else
			{
				m_LogLevel = logLevel;
			}
			
			if (!logFile.isEmpty())
			{
				m_LogFile = logFile;
			}

			qInstallMsgHandler(customMessageHandler); 
		#endif 
	}
};
 

#endif // LOG_H

main.cpp

#include "StackWidget.h"
#include <QtGui/QApplication>
#include "log.h"


int main(int argc, char *argv[])
{
	if (argc > 1)
	{
		QT_LOG::logInit(QString(argv[0]).split(QDir::separator()).last().remove(".exe") + ".log",QString(argv[1]).toUInt());
	}
	else
	{
		QT_LOG::logInit(QString(argv[0]).split(QDir::separator()).last().remove(".exe") + ".log");
	}

	QApplication a(argc, argv);


	StackWidget w;
	w.show();
	return a.exec();
}

猜你喜欢

转载自blog.csdn.net/u011731378/article/details/79988977