#include "filelogger.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "LogInfo.h" #define LOG_FILE_PATH "/home/plg/loginfo/" void FileLogger::refreshSettings() { mutex.lock(); QString oldFileName=fileName; settings->sync(); fileName = LOG_FILE_PATH; // fileName=settings->value("fileName").toString(); // LogInfo::setRunStatusText(tr("fileName: %1").arg(fileName)); QDate today = QDate::currentDate(); QString todayString=today.toString(Qt::ISODate); // 计算前七天的日期 //QDate oneWeekAgo = today.addDays(-7); fileName+=today.toString(Qt::ISODate); fileName+="/"; fileName+="log.txt"; static QString lastDay = ""; if(lastDay!=todayString) { TimerDel->start(30000); lastDay=todayString; } #ifdef Q_OS_WIN32 if (QDir::isRelativePath(fileName) && settings->format()!=QSettings::NativeFormat) #else if (QDir::isRelativePath(fileName)) #endif { QFileInfo configFile(settings->fileName()); fileName=QFileInfo(configFile.absolutePath(),fileName).absoluteFilePath(); } maxSize=settings->value("maxSize",0).toLongLong(); maxBackups=settings->value("maxBackups",0).toInt(); msgFormat=settings->value("msgFormat","{timestamp} {type} {msg}").toString(); timestampFormat=settings->value("timestampFormat","yyyy-MM-dd hh:mm:ss.zzz").toString(); bufferSize=settings->value("bufferSize",0).toInt(); QByteArray minLevelStr = settings->value("minLevel","ALL").toByteArray(); if (minLevelStr=="ALL" || minLevelStr=="DEBUG" || minLevelStr=="0") { minLevel=QtDebugMsg; } else if (minLevelStr=="WARNING" || minLevelStr=="WARN" || minLevelStr=="1") { minLevel=QtWarningMsg; } else if (minLevelStr=="ERROR" || minLevelStr=="CRITICAL" || minLevelStr=="2") { minLevel=QtCriticalMsg; } else if (minLevelStr=="FATAL" || minLevelStr=="3") { // minLevel=QtMsgType::QtFatalMsg; minLevel=QtFatalMsg; } // else if (minLevelStr=="INFO" || minLevelStr=="4") // { // minLevel=QtMsgType::QtInfoMsg; // } if (oldFileName!=fileName) { fprintf(stderr,"Logging to %s\n",qPrintable(fileName)); close(); open(); } mutex.unlock(); } FileLogger::FileLogger(QSettings *settings, const int refreshInterval, QObject* parent) : Logger(parent) { TimerDel = new QTimer(this); connect(TimerDel,SIGNAL(timeout()),this,SLOT(timeOutToDelete())); Q_ASSERT(settings!=nullptr); Q_ASSERT(refreshInterval>=0); this->settings=settings; file=nullptr; if (refreshInterval>0) { refreshTimer.start(refreshInterval,this); } flushTimer.start(1000,this); refreshSettings(); } FileLogger::~FileLogger() { close(); } void FileLogger::write(const LogMessage* logMessage) { if (file) { // qDebug()<<"Critical message output test\n"; // qCritical("This is a critical message of test\n"); file->write(qPrintable(logMessage->toString(msgFormat,timestampFormat))); if (logMessage->getType()>=QtCriticalMsg) { file->flush(); } if (file->error()) { qWarning("Cannot write to log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); close(); } } if (!file) { Logger::write(logMessage); } } void FileLogger::open() { if (fileName.isEmpty()) { qWarning("Name of logFile is empty"); } else { file=new QFile(fileName); QFileInfo fileInfo(fileName); // 检查文件路径是否有效 if (!fileInfo.exists()) { // 获取文件所在的目录路径 QString dirPath = QFileInfo(fileName).absoluteDir().path(); // 检查目录是否存在 if (!QDir(dirPath).exists()) { // 如果目录不存在,则创建目录 QDir().mkpath(dirPath); if (!QDir(dirPath).exists()) { // 如果创建目录失败,显示错误消息 qDebug("Cannot create directory for log file: %s", qPrintable(dirPath)); delete file; file = nullptr; return; } } } if (!file->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { qWarning("Cannot open log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); file=nullptr; } } } void FileLogger::close() { if (file) { file->close(); delete file; file=nullptr; } } void FileLogger::rotate() { int count=0; forever { QFile bakFile(QString("%1.%2").arg(fileName).arg(count+1)); if (bakFile.exists()) { ++count; } else { break; } } while (maxBackups>0 && count>=maxBackups) { QFile::remove(QString("%1.%2").arg(fileName).arg(count)); --count; } for (int i=count; i>0; --i) { QFile::rename(QString("%1.%2").arg(fileName).arg(i),QString("%1.%2").arg(fileName).arg(i+1)); } QFile::rename(fileName,fileName+".1"); } void FileLogger::timerEvent(QTimerEvent* event) { if (!event) { return; } else if (event->timerId()==refreshTimer.timerId()) { refreshSettings(); } else if (event->timerId()==flushTimer.timerId() && file) { mutex.lock(); file->flush(); if (maxSize>0 && file->size()>=maxSize) { close(); rotate(); open(); } mutex.unlock(); } } bool FileLogger::removeDirectory(const QString &directoryPath) { // 检查目录是否存在 QDir dir(directoryPath); if (dir.exists()) { system((char *)((QString("rm -r %1").arg(directoryPath)).toLatin1().data())); return true; } return false; } void FileLogger::timeOutToDelete(){ QDate today = QDate::currentDate(); for(int daysAgo=14;daysAgo>=7;--daysAgo){ QString needToDelFoldPath=LOG_FILE_PATH; QDate pastDate=today.addDays(-daysAgo); needToDelFoldPath+=pastDate.toString(Qt::ISODate); needToDelFoldPath+="/"; if (QDir(needToDelFoldPath).exists()) { bool result= removeDirectory(needToDelFoldPath); if(result){ qDebug()<<"The directory and all its contents have been removed"; LogInfo::setRunStatusText(tr("The directory and all its contents have been removed")); }else{ qDebug() << "Failed to remove the directory"; LogInfo::setRunStatusText(tr("Failed to remove the directory")); } } } TimerDel->stop(); }