一. 内容简介
构建QT日志系统。遇到的问题以及结局办法,读取日志文件,用于检查程序运行情况,并且修复异常数据。
二. 软件环境
2.1 QT 5.14.1
新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。
QT编译器采用的是MSVC2017 64bit。
链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234
2.3 Visual studio 2017
Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。
三. 主要流程
3.1 介绍用到的东西
3.2 读取日志文件,用于检查程序运行情况
3.3 检查并修复异常数据
四. 具体步骤
4.1 介绍用到的东西
日志系统的作用,记录运行情况,方便自己调试,也可以看到程序运行时间。根据日志可以看到程序上次是否正常运行,如果是异常退出,可以根据日志对异常操作做一些处理,就比如往数据库中存数据,没存完程序退出,这时候就可以根据日志删除错误数据了。主要的技术就是读写文件。
下面代码引用别人的,这块代码主要用于日志输出格式设置,这个博主写的很好,我拿了其中一段。
// 设置输出信息格式
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2").arg(current_date).arg(msg);
// 输出信息至文件中(读写、追加形式)
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
博主给封装函数了,而且博主建议将这个日志用的东西都封装为一个模块,下面我封装了一部分
头文件
#ifndef MLOG_H
#define MLOG_H
#include <QObject>
#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QDateTime>
#include <QMutex>
#include <QString>
#include <qapplication.h>
#include <QMessageBox>
class Mlog : public QObject
{
Q_OBJECT
public:
QFile file;
explicit Mlog(QObject *parent = nullptr);
void Debug(QString msg);
void Warning(QString msg);
void Critical(QString msg);
void Operation(QString msg);
void fileClose();
void fileRead();
QString fileWrite(QString msg,QString model);
private:
signals:
};
#endif // MLOG_H
cpp
#include "mlog.h"
Mlog::Mlog(QObject *parent) : QObject(parent)
{
file.setFileName("./log.txt");
file.open(QIODevice::Append);
file.close();
}
void Mlog::fileRead()
{
file.open(QIODevice::ReadOnly);
if(!file.isOpen())
{
}
file.close();
QFile f("./log.txt");
f.open(QIODevice::Truncate);
if(!f.isOpen())
{
}
f.close();
}
void Mlog::Debug(QString msg)
{
fileWrite(msg,"Debug");
}
void Mlog::Warning(QString msg)
{
fileWrite(msg,"Warning");
}
void Mlog::Critical(QString msg)
{
fileWrite(msg,"Critical");
}
void Mlog::Operation(QString msg)
{
fileWrite(msg,"Operation");
}
void Mlog::fileClose()
{
file.close();
}
QString Mlog::fileWrite(QString msg,QString model)
{
file.open(QIODevice::WriteOnly | QIODevice::Append);
if(!file.isOpen())
{
return "日志读取失败";
}
// 设置输出信息格式
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2: %3").arg(current_date).arg(model).arg(msg);
// 输出信息至文件中(读写、追加形式)
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
}
封装好了以后去用的时候,问题就来了许多,
1. 在mainwindow.h中实例一下对象的时候,就一直显示报错,这种情况

解决办法:因为mianwindow.h中包含了mlog.h,而在mlog.h中包含了mianwindow.h,就报错了,删mlog.h中包含的mianwindow.h就好了。
2. 构造函数作用是创建文件(假如没有的话,有的话就没影响),然后我想先读取上一次的运行情况,然后清空文件(用只写方式打开就可以清空),但是我的就一直报错。这些只写打开一直报错,然后后边只读也开始报错,没法用
void Mlog::fileRead()
{
file.open(QIODevice::ReadOnly);
if(!file.isOpen())
{
}
file.close();
QFile f("./log.txt");
f.open(QIODevice::Truncate);
if(!f.isOpen())
{
}
f.close();
}
解决办法:
清空文件我发现我怎么写都报错,具体原因我也不知道,我就试着往里面加了点动作,他就不报错了,玄学。
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
}
file.close();
}
3. 在使用日志时候,在这个里面写的话,写多少个都没事,程序没问题,但是我在按键事件里面写超过一个就报错,我想可能是内存满了,我按键事件计算的东西很多。

解决办法:
我就没用这个类,也没用函数,而是直接在里面写了,就不报错了,奇奇怪怪,代码一个就下边写的
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QFile f("./log.txt");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&f);
text_stream << QString("%1 %2: %3").arg(current_date).arg("Operation").arg("Prepare calculation;") << "\r\n";
f.flush();
f.close();
在之后,我索性就没用上边封好的类,而是在类里面又写了几个函数,但是输出语句就单独写了,写的函数只是用来处理数据
// 定义
QFile file;
void Debug(QString msg);
void Warning(QString msg);
void Critical(QString msg);
void Operation(QString msg);
void fileCreate();
void fileRead1();
void fileRead2();
void fileClear();
void fileOpen();
QString fileWrite(QString msg,QString model);
void fileClose();
// cpp
void MainWindow::Debug(QString msg)
{
fileWrite(msg,"Debug");
}
void MainWindow::Warning(QString msg)
{
fileWrite(msg,"Warning");
}
void MainWindow::Critical(QString msg)
{
fileWrite(msg,"Critical");
}
void MainWindow::Operation(QString msg)
{
fileWrite(msg,"Operation");
}
void MainWindow::fileClose()
{
file.close();
}
void MainWindow::fileRead1()
{
int n = 0;
QString sss[100];
file.open(QIODevice::ReadOnly);
QString b[100][18];
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
if(array.length()>300){
sss[n] = array;
n++;
}
}
file.close();
}
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QFile f("./log.txt");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&f);
text_stream << QString("%1 %2: %3").arg(current_date).arg("Debug").arg("------------") << "\r\n";
f.flush();
int h = 0;
int ll = 0;
int qqq[18][2];
for(int i = 0;i<n;i++

最低0.47元/天 解锁文章
1710

被折叠的 条评论
为什么被折叠?



