一、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(); }