ZBLOG

#include #include #include #include #include #include #include #include "LogFile.h" QFile* LogFile::m_pFile = 0; QTextStream *LogFile::ts = 0; int LogFile::fileCount = 30;...

要改造 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 ;
}

//...(其他方法保持不变)...

修改说明:

  1. 创建新的日志文件:我增加了一个 createNewLogfile() 方法来处理日志文件的创建和打开。该方法会被调用一次以初始化,并在每个新的一天开始时被再次调用。

  2. 设置定时器:在 open() 函数中,我计算了到达下一个零点的毫秒数,并使用这个值启动了计时器。

  3. 关闭当前日志文件:在 createNewLogfile() 中,如果当前已经有打开的日志文件,会先关闭它,然后再创建新的日志文件。

  4. makeFilename 更新:为了让每个日志都带有日期,更新了此函数返回的名称格式。

这样,当程序运行时,它将在每天的午夜自动生成新的日志文件,而旧的将继续保留。这种方式保证了每一天都有独立的新日志记录。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=6566

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?