新增日志重定向和运行时间记录

This commit is contained in:
feiyangqingyun
2019-10-14 10:24:47 +08:00
parent 6cb47c6db3
commit 534c165c16
16 changed files with 908 additions and 122 deletions

View File

@@ -0,0 +1,24 @@
#pragma execution_character_set("utf-8")
#include "frmsaveruntime.h"
#include "ui_frmsaveruntime.h"
#include "saveruntime.h"
frmSaveRunTime::frmSaveRunTime(QWidget *parent) : QWidget(parent), ui(new Ui::frmSaveRunTime)
{
ui->setupUi(this);
}
frmSaveRunTime::~frmSaveRunTime()
{
delete ui;
}
void frmSaveRunTime::on_checkBox_stateChanged(int arg1)
{
if (arg1 == 0) {
SaveRunTime::Instance()->stop();
} else {
SaveRunTime::Instance()->start();
}
}

View File

@@ -0,0 +1,25 @@
#ifndef FRMSAVERUNTIME_H
#define FRMSAVERUNTIME_H
#include <QWidget>
namespace Ui {
class frmSaveRunTime;
}
class frmSaveRunTime : public QWidget
{
Q_OBJECT
public:
explicit frmSaveRunTime(QWidget *parent = 0);
~frmSaveRunTime();
private:
Ui::frmSaveRunTime *ui;
private slots:
void on_checkBox_stateChanged(int arg1);
};
#endif // FRMSAVERUNTIME_H

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>frmSaveRunTime</class>
<widget class="QWidget" name="frmSaveRunTime">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>启动服务</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

31
saveruntime/main.cpp Normal file
View File

@@ -0,0 +1,31 @@
#pragma execution_character_set("utf-8")
#include "frmsaveruntime.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setFont(QFont("Microsoft Yahei", 9));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
#endif
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
#endif
frmSaveRunTime w;
w.setWindowTitle("保存运行时间");
w.show();
return a.exec();
}

221
saveruntime/saveruntime.cpp Normal file
View File

@@ -0,0 +1,221 @@
#include "saveruntime.h"
#include "qmutex.h"
#include "qapplication.h"
#include "qtimer.h"
#include "qfile.h"
#include "qtextstream.h"
#include "qstringlist.h"
#include "qdebug.h"
#ifdef Q_OS_WIN
#define NEWLINE "\r\n"
#else
#define NEWLINE "\n"
#endif
QScopedPointer<SaveRunTime> SaveRunTime::self;
SaveRunTime *SaveRunTime::Instance()
{
if (self.isNull()) {
static QMutex mutex;
QMutexLocker locker(&mutex);
if (self.isNull()) {
self.reset(new SaveRunTime);
}
}
return self.data();
}
SaveRunTime::SaveRunTime(QObject *parent) : QObject(parent)
{
path = qApp->applicationDirPath();
QString str = qApp->applicationFilePath();
QStringList list = str.split("/");
name = list.at(list.count() - 1).split(".").at(0);
saveInterval = 1 * 60 * 1000;
startTime = QDateTime::currentDateTime();
timerSave = new QTimer(this);
timerSave->setInterval(saveInterval);
connect(timerSave, SIGNAL(timeout()), this, SLOT(saveLog()));
}
void SaveRunTime::start()
{
timerSave->start();
initLog();
appendLog();
saveLog();
}
void SaveRunTime::stop()
{
timerSave->stop();
}
void SaveRunTime::getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute)
{
qint64 sec = startTime.secsTo(endTime);
day = hour = minute = 0;
int seconds = 0;
while (sec > 0) {
seconds++;
if (seconds == 60) {
minute++;
seconds = 0;
}
if (minute == 60) {
hour++;
minute = 0;
}
if (hour == 24) {
day++;
hour = 0;
}
sec--;
}
}
void SaveRunTime::initLog()
{
//判断当前年份的记事本文件是否存在,不存在则新建并且写入标题
//存在则自动读取最后一行的id号 记事本文件格式内容
//幢号 开始时间 结束时间 已运行时间
//1 2016-01-01 12:33:33 2016-02-05 12:12:12 day: 0 hour: 0 minute: 0
logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
QFile file(logFile);
if (file.size() == 0) {
if (file.open(QFile::WriteOnly | QFile::Text)) {
QString strID = QString("%1\t").arg("编号");
QString strStartTime = QString("%1\t\t").arg("开始时间");
QString strEndTime = QString("%1\t\t").arg("结束时间");
QString strRunTime = QString("%1").arg("已运行时间");
QString line = strID + strStartTime + strEndTime + strRunTime;
QTextStream stream(&file);
stream << line << NEWLINE;
file.close();
lastID = 0;
}
} else {
if (file.open(QFile::ReadOnly)) {
QString lastLine;
while (!file.atEnd()) {
lastLine = file.readLine();
}
file.close();
QStringList list = lastLine.split("\t");
lastID = list.at(0).toInt();
}
}
lastID++;
}
void SaveRunTime::appendLog()
{
logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
QFile file(logFile);
//写入当前首次运行时间
if (file.open(QFile::WriteOnly | QFile::Append | QFile::Text)) {
QString strID = QString("%1\t").arg(lastID);
QString strStartTime = QString("%1\t").arg(startTime.toString("yyyy-MM-dd HH:mm:ss"));
QString strEndTime = QString("%1\t").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
int day, hour, minute;
getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute);
QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute);
QString line = strID + strStartTime + strEndTime + strRunTime;
QTextStream stream(&file);
stream << line << NEWLINE;
file.close();
}
}
void SaveRunTime::saveLog()
{
//每次保存都是将之前的所有文本读取出来,然后替换最后一行即可
logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
QFile file(logFile);
//如果日志文件不存在,则初始化一个日志文件
if (file.size() == 0) {
initLog();
appendLog();
return;
}
if (file.open(QFile::ReadWrite)) {
//一行行读取到链表
QStringList content;
while (!file.atEnd()) {
content.append(file.readLine());
}
//重新清空文件
file.resize(0);
//如果行数小于2则返回
if (content.count() < 2) {
file.close();
return;
}
QString lastLine = content.last();
QStringList list = lastLine.split("\t");
//计算已运行时间
int day, hour, minute;
getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute);
QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute);
//重新拼接最后一行
list[2] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
list[3] = strRunTime;
lastLine = list.join("\t");
//重新替换最后一行并写入新的数据
content[content.count() - 1] = lastLine;
QTextStream stream(&file);
stream << content.join("") << NEWLINE;
file.close();
}
}
void SaveRunTime::setPath(const QString &path)
{
if (this->path != path) {
this->path = path;
}
}
void SaveRunTime::setName(const QString &name)
{
if (this->name != name) {
this->name = name;
}
}
void SaveRunTime::setSaveInterval(int saveInterval)
{
if (this->saveInterval != saveInterval) {
this->saveInterval = saveInterval;
timerSave->setInterval(saveInterval);
}
}

54
saveruntime/saveruntime.h Normal file
View File

@@ -0,0 +1,54 @@
#ifndef SAVERUNTIME_H
#define SAVERUNTIME_H
#include <QObject>
#include <QDateTime>
class QTimer;
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif
class QDESIGNER_WIDGET_EXPORT SaveRunTime : public QObject
#else
class SaveRunTime : public QObject
#endif
{
Q_OBJECT
public:
static SaveRunTime *Instance();
explicit SaveRunTime(QObject *parent = 0);
private:
static QScopedPointer<SaveRunTime> self;
QString path; //日志文件路径
QString name; //日志文件名称
int lastID;
int saveInterval;
QDateTime startTime;
QString logFile;
QTimer *timerSave;
private:
void getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute);
signals:
public slots:
void start(); //启动服务
void stop(); //停止服务
void initLog(); //初始化日志文件
void appendLog(); //追加一条记录到日志文件
void saveLog(); //保存运行时间到日志文件
void setPath(const QString &path);
void setName(const QString &name);
void setSaveInterval(int saveInterval);
};
#endif // SAVERUNTIME_H

View File

@@ -0,0 +1,23 @@
#-------------------------------------------------
#
# Project created by QtCreator 2019-02-16T15:08:47
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = saveruntime
TEMPLATE = app
DESTDIR = $$PWD/../bin
CONFIG += warn_off
SOURCES += main.cpp
SOURCES += frmsaveruntime.cpp
SOURCES += saveruntime.cpp
HEADERS += frmsaveruntime.h
HEADERS += saveruntime.h
FORMS += frmsaveruntime.ui