重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一个良好的应用程序应该具有日志记录系统,这样便于后期维护和发布程序后追踪错误,常用的日志框架如log4、logplus等可以自己下载使用,本文主要讲述QT重定向记录日志的方法。
思路及代码QT4中使用
Q_CORE_EXPORT QT_DEPRECATED QtMsgHandler qInstallMsgHandler(QtMsgHandler);
QT5中使用
Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler);
定义指针函数用于自定义回调
typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
定义回调函数:
#if (QT_VERSION<= QT_VERSION_CHECK(5,0,0))
void outputLogMessage(QtMsgType type, const char *msg)
#else
void outputLogMessage(QtMsgType type, const QMessageLogContext& context, const QString& msg)
#endif
{//转发给单例的成员函数
LogManage::getInstance()->outputLog(type, context, msg);
}
成员函数自定义:
创新互联是一家专注于成都网站设计、成都做网站与策划设计,木兰网站建设哪家好?创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:木兰等地区。木兰做网站价格咨询:18982081108void LogManage::outputLog(QtMsgType type, const QMessageLogContext &, const QString &msg)
{//加锁,防止多线程中qdebug太频繁导致崩溃
QMutex mutex;
QMutexLocker locker(&mutex);
QString content;
//这里可以根据不同的类型加上不同的头部用于区分
switch (type) {case QtDebugMsg:
content = QString("[Debug]%1%2").arg(msg).arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]"));
break;
case QtWarningMsg:
content = QString("[Info]%1%2").arg(msg).arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]"));
break;
case QtCriticalMsg:
content = QString("[Critical]%1%2").arg(msg).arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]"));
break;
case QtFatalMsg:
content = QString("[Fatal]%1%2").arg(msg).arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]"));
break;
case QtInfoMsg:
content = QString("[Info]%1%2").arg(msg).arg(QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]"));
}
LogManage::getInstance()->save(content);
}
注册回调函数:
#if (QT_VERSION<= QT_VERSION_CHECK(5,0,0))
qInstallMsgHandler(outputLogMessage);
#else
qInstallMessageHandler(outputLogMessage);
#endif
完成上面三个步骤,重定向就完成了,具体的细节比如日志记录方式存储位置可以自己记录。
QString fileName = QString("%1/%2").arg(path).arg("Log");
QDir* dir = new QDir();
if (!dir->exists(fileName)) {dir->mkpath(fileName);
}
else
{fileName += QString("/%1.txt").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd"));
if (this->fileName != fileName) { this->fileName = fileName;
if (file->isOpen()) { file->close();
}
file->setFileName(fileName);
if (!file->open(QIODevice::WriteOnly | QIODevice::Append | QFile::Text))
{ return;
}
}
QTextStream logStream(file);
logStream<< content<< "\n";
}
效果
我采用每天记录一个日志文件,显示详细日期等,在大型项目中,可能要考虑txt记录上限问题,我们可以在文件创建中新增文本等方式来记录,在这暂时够用不做过多解析。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧