要改造 LogFile
类以便每天在 0 时 0 分 0 秒自动创建新的日志文件,我们需要对定时器和文件命名逻辑进行一些调整。以下是修改后的代码示例:
#include <QString>
#include <QFile>
#include <QTime>
#include <QTextStream>
#include <QDir>
#include <QDebug>
#include <QCoreApplication>
#include "LogFile.h"
QFile* LogFile::m_pFile = nullptr;
QTextStream *LogFile::ts = nullptr;
int LogFile::fileCount = 30;
QString LogFile::strDir = "log";
QString LogFile::strPrefix = "control-log";
QString LogFile::strPostfix = ".txt";
QMutex LogFile::mutex;
QList<QString> LogFile::items;
QTimer * LogFile::timer = nullptr;
QThread* LogFile::workThread = nullptr;
LogFile::LogFile(void)
{
}
LogFile::~LogFile(void)
{
}
bool LogFile::open()
{
createNewLogfile(); // 创建新日志文件
workThread = new QThread();
timer = new QTimer();
timer->setParent(nullptr);
connect(timer, &QTimer::timeout, this, &LogFile::onCheck, Qt::DirectConnection);
connect(workThread, &QThread::started, this, &LogFile::workThreadStarted, Qt::DirectConnection);
connect(workThread, &QThread::finished, this, &LogFile::workThreadFinished, Qt::DirectConnection);
workThread->start();
// 设置定时器触发的时间为下一个零点
QDateTime now = QDateTime::currentDateTime();
QDateTime nextMidnight(now.date().addDays(1), QTime(0, 0));
int msecToNextMidnight = now.msecsTo(nextMidnight);
timer->start(msecToNextMidnight);
deleteOldFiles();
return true;
}
void LogFile::createNewLogfile()
{
if (m_pFile) {
close(); // 如果当前日志文件已打开,则先关闭它
}
m_pFile = new QFile();
m_pFile->setFileName(makeDirectory() + QDir::separator() + makeFileName());
if (m_pFile->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
ts = new QTextStream(m_pFile);
}
else
{
delete m_pFile;
m_pFile = nullptr;
qDebug() << "Failed to open log file.";
}
}
void LogFile::close()
{
if (workThread)
{
workThread->quit();
workThread->wait(2000);
delete workThread;
workThread = nullptr;
qDebug() << "delete workThread end";
timer->stop();
delete timer;
timer = nullptr;
}
if (m_pFile)
{
dump(10000);
if(ts)
{
delete ts;
ts = nullptr;
}
m_pFile->close();
delete m_p File;
m_p File= nullptr;
}
}
void LogFie:write(QtMsgType type,const QMessage LogContext& context,const QString& msg) {
Q_UNUSED(context);
if(ts == nulltptr)
return ;
QString txt ;
QString tmpStr= QTime ::currentTime().toString ("HH:mm:ss.zzz ");
switch(type){
case QtDebugMsg:
txt= QString ("%1 [ Debug ] : %2 ").arg(tmpStr).arg(msg );
break ;
case QtWarningMsg:
txt= QString ("%1 [ Warning ] : %2 ").arg(tmpStr).arg(msg );
break ;
case QtCriticalMsg:
txt= QString ("%1 [ Critical ] : %2 ").arg(tmpStr).arg(msg );
break ;
case QtFatalMsg:
txt= QString ("%1 [ Fatal ] : %2 ").arg(tmpStr).arg(msg );
break ;
};
mutex.lock ();
items.push_back(txt);
mutex.unlock ();
}
// ...(其他方法保持不变)...
// 修改 makeFilename 方法以添加日期:
QString LogFil:makefimeName(){
QString tmpStr ;
tmpStr= QDateTime ::currentDate Time().toString("yyyyMMdd");
return strPrefix+tmpStr+strPostfix ;
}
//...(其他方法保持不变)...
修改说明:
创建新的日志文件:我增加了一个
createNewLogfile()
方法来处理日志文件的创建和打开。该方法会被调用一次以初始化,并在每个新的一天开始时被再次调用。设置定时器:在
open()
函数中,我计算了到达下一个零点的毫秒数,并使用这个值启动了计时器。关闭当前日志文件:在
createNewLogfile()
中,如果当前已经有打开的日志文件,会先关闭它,然后再创建新的日志文件。makeFilename
更新:为了让每个日志都带有日期,更新了此函数返回的名称格式。
这样,当程序运行时,它将在每天的午夜自动生成新的日志文件,而旧的将继续保留。这种方式保证了每一天都有独立的新日志记录。
内容由零声教学AI助手提供,问题来源于学员提问