qdebug重定向到日志文件

时间:2021-07-19 03:32:26

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

    qDebug : 调试信息提示
    qWarning: 一般的警告提示

    qCritical: 严重错误提示

    qFatal: 致命错误提示


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

log.h内容:

#ifndef LOG_H
#define LOG_H

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

//默认调试级别为warning,即小于warning级别的都不会写入日志文件
//只有release版本的时候,才会输出到日志,debug版本正常输出到终端。
namespace QT_LOG
{//默认文件名为当前时间命名的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)//设置输出日志级别,小于该级别,将不会写入日志文件,默认是warning级别,即debug信息不会写入日志文件
		{
			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();
	}
//默认调试级别为warning及以上才会写入日志文件,默认log文件名为程序启动时间命名的log文件
	void logInit(QString logFile = "",int logLevel = 1)
	{
		#ifndef _DEBUG  //实现debug版本的时候,输出到终端;release版本的时候输出到日志文件
			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)
	{//设置log文件名为可执行文件名,如果程序启动时有参数,则认为参数为调试级别,否则,按默认级别
		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();
}