在程序的运行过程中,debug版的可以调试,查看输出信息,release版的程序在运行过程中一旦出现崩溃等问题,使得无法查看问题发生的点,于是在项目中添加日志,变得极为重要。
此日志可以在程序debug版的时候,不生成日志,直接通过控制台查看输出信息,在release版的情况下可以生成日志,供查阅。
具体代码如下:
log.hpp
#ifndef LOG_H
#define LOG_H
#include <QCoreApplication>
#include <QDebug>
//#define OUTPUT_LOG //输出信息输出到输出控制台还是日志
#ifdef OUTPUT_LOG
#define outPut qOut//release版
#else
#define outPut qDebug()//debug版
#endif
//日志文件名称
#define LOG_FILE QCoreApplication::applicationDirPath()/*strFilePath*/ + "/logger.txt"
#define qOut qDebug()<<__FUNCTION__<<"["<<__LINE__<<"]"
#define xErrPrint qCritical()<<__FUNCTION__<<"["<<__LINE__<<"]"
#endif // LOG_H
在release版的时候打开#define OUTPUT_LOG宏定义的注释,这样在release版程序的运行目录下会生成日志文件,debug版程序可以不用打开#define OUTPUT_LOG的注释。
main.cpp
#include "maindialog.h"
#include <QApplication>
#include <QFile>
#include "log.hpp"
#include <QMutex>
#include <QDateTime>
#include <QScreen>
void MessageTypePut(QtMsgType type, const QMessageLogContext &context, const QString &msg);
int main(int argc, char *argv[])
{
#ifdef OUTPUT_LOG
qInstallMessageHandler(MessageTypePut);
#endif
QApplication a(argc, argv);
QString qss;
QString strNameqss;
QScreen *screenPrimary=QGuiApplication::primaryScreen();
QRect screen =screenPrimary->availableGeometry();
if(screen.width() > BASE_W && screen.height() > BASE_H)
{
strNameqss = ":/guangdianadjust.qss";
outPut<<"读取QSS文件guangdianadjust.qss";
}
else
{
strNameqss = ":/guangdian.qss";
}
QFile qssFile(strNameqss);//将qss引入到项目的资源文件,防止运行目录发生变化,找不到文件
qssFile.open(QFile::ReadOnly);
if(qssFile.isOpen())
{
qss = QString(qssFile.readAll());
a.setStyleSheet(qss);
qssFile.close();
}
MainDialog w;
w.show();
return a.exec();
}
void MessageTypePut(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// getCurrFilePath();
static QMutex mutex;
mutex.lock();
QString text;
switch(type)
{
case QtDebugMsg:
text = QString("Debug:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critical:");
break;
case QtFatalMsg:
text = QString("Fatal:");
break;
default:
break;
}
//日志写到文件
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString message = QString("%1 %2%3").arg(current_date_time).arg(text).arg(msg);
QFile file(LOG_FILE);
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();//将缓冲的数据刷新到文件
file.close();
mutex.unlock();
}
在需要日志输出的地方调用output输出,使用方法和qDebug()相似,需要包含头文件#include “log.hpp”。
使用案例:
#include "log.hpp"
str = QCoreApplication::applicationDirPath();
str += "\\11.png";
outPut<<"路径名:"<<str;
在主函数中安装消息句柄,首先声明这个函数MessageTypePut,按照这样就可以实现一个简单的日志输出。并在release版的程序生成日志,在debug版直接在输出台输出信息。