最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實現(xiàn)日志文件的滾動寫入

 更新時間:2024年11月18日 15:47:25   作者:二分掌柜的  
這篇文章主要為大家介紹了如何使用Qt實現(xiàn)日志文件的滾動寫入功能,在日志文件達到10MB時創(chuàng)建新的日志文件,并且在總?cè)罩疚募笮∵_到10GB時開始覆蓋最早的日志文件,需要的可以參考下

Qt 日志文件的滾動寫入

flyfish

日志文件的滾動寫入功能。在日志文件達到10MB時創(chuàng)建新的日志文件,并且在總?cè)罩疚募笮∵_到10GB時開始覆蓋最早的日志文件

以監(jiān)控一個文件夾的寫日志為例

日志文件創(chuàng)建與管理

初始化日志文件:在FileMonitor類的構(gòu)造函數(shù)中,會創(chuàng)建第一個日志文件。日志文件的命名格式為 “file_monitor_序號.log”,初始序號為 0。

滾動寫入機制

單個日志文件大小限制:當(dāng)向當(dāng)前日志文件寫入內(nèi)容使得其大小達到 10MB(通過logFileSizeLimit變量設(shè)定,值為10 * 1024 * 1024字節(jié))時,會關(guān)閉當(dāng)前日志文件,增加日志文件索引,然后創(chuàng)建新的日志文件用于后續(xù)的日志記錄。

總?cè)罩疚募笮∠拗?/h3>

同時,會監(jiān)控所有日志文件的總體大小,當(dāng)總大小達到 10GB(通過totalLogSizeLimit變量設(shè)定,值為10 * 1024 * 1024 * 1024字節(jié))時,會刪除最早創(chuàng)建的日志文件(通過計算最早日志文件的文件名并判斷其是否存在,若存在則刪除),以確???cè)罩疚募笮〔粫o限制增長。

日志內(nèi)容記錄

對于文件創(chuàng)建、刪除、修改等事件,會將事件發(fā)生的當(dāng)前日期時間(格式為 “yyyy-MM-dd hh:mm:ss”)、事件類型(如 “File created”、“File deleted”、“File modified”)以及相關(guān)文件的路徑信息,按照特定格式寫入到當(dāng)前正在使用的日志文件中。并且每次寫入后會立即刷新緩沖區(qū),確保日志內(nèi)容及時寫入文件。同時,會實時更新當(dāng)前日志文件的大小信息,以便判斷是否達到單個日志文件大小限制。

#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <QFileInfo>
#include <QSet>
#include <iostream>

// FileMonitor類繼承自QObject,用于監(jiān)控指定文件夾的文件變化并記錄相關(guān)日志
class FileMonitor : public QObject {
    Q_OBJECT

public:
    // 構(gòu)造函數(shù),用于初始化文件監(jiān)控器相關(guān)參數(shù)
    explicit FileMonitor(const QString &path, QObject *parent = nullptr)
        : QObject(parent),
          // 創(chuàng)建文件系統(tǒng)監(jiān)控器對象,并將其作為當(dāng)前對象的子對象
          watcher(new QFileSystemWatcher(this)),
          rootPath(path),
          // 設(shè)置單個日志文件的大小限制為10MB,這里將10MB轉(zhuǎn)換為字節(jié)數(shù)
          logFileSizeLimit(static_cast<quint64>(10) * 1024 * 1024),
          // 設(shè)置總?cè)罩疚募笮∠拗茷?0GB,同樣轉(zhuǎn)換為字節(jié)數(shù)
          totalLogSizeLimit(static_cast<quint64>(10) * 1024 * 1024 * 1024),
          currentLogFileIndex(0),
          currentLogFileSize(0) {

        // 將指定的監(jiān)控路徑添加到文件系統(tǒng)監(jiān)控器中
        watcher->addPath(rootPath);

        // 獲取監(jiān)控路徑下初始的文件列表
        QDir dir(rootPath);
        initialFiles = dir.entryList(QDir::Files);

        // 連接文件系統(tǒng)監(jiān)控器的目錄變化信號到對應(yīng)的槽函數(shù)
        connect(watcher, &QFileSystemWatcher::directoryChanged, this, &FileMonitor::onDirectoryChanged);
        // 連接文件系統(tǒng)監(jiān)控器的文件變化信號到對應(yīng)的槽函數(shù)
        connect(watcher, &QFileSystemWatcher::fileChanged, this, &FileMonitor::onFileChanged);

        // 初始化日志文件,創(chuàng)建第一個日志文件
        createNewLogFile();
    }

private slots:
    // 當(dāng)監(jiān)控的目錄發(fā)生變化時調(diào)用的槽函數(shù)
    void onDirectoryChanged(const QString &path) {
        std::cout << "Directory changed: " << qPrintable(path) << std::endl;

        // 獲取當(dāng)前監(jiān)控目錄下的文件列表
        QDir dir(rootPath);
        QStringList currentFiles = dir.entryList(QDir::Files);

        // 找出新增的文件,通過集合運算實現(xiàn)
        QSet<QString> newFiles = QSet<QString>(currentFiles.begin(), currentFiles.end()).subtract(QSet<QString>(initialFiles.begin(), initialFiles.end()));
        // 遍歷新增的文件,記錄文件創(chuàng)建事件到日志
        for (const QString &file : newFiles) {
            logEvent("File created", dir.absoluteFilePath(file));
        }

        // 找出被刪除的文件,同樣通過集合運算
        QSet<QString> deletedFiles = QSet<QString>(initialFiles.begin(), initialFiles.end()).subtract(QSet<QString>(currentFiles.begin(), currentFiles.end()));
        // 遍歷被刪除的文件,記錄文件刪除事件到日志
        for (const QString &file : deletedFiles) {
            logEvent("File deleted", dir.absoluteFilePath(file));
        }

        // 更新初始文件列表,使其為當(dāng)前的文件列表,以便下次檢測文件變化
        initialFiles = currentFiles;
    }

    // 當(dāng)監(jiān)控的文件發(fā)生變化時調(diào)用的槽函數(shù)
    void onFileChanged(const QString &path) {
        std::cout << "File changed: " << qPrintable(path) << std::endl;
        // 記錄文件修改事件到日志
        logEvent("File modified", path);
    }

private:
    // 創(chuàng)建新的日志文件的函數(shù)
    void createNewLogFile() {
        // 構(gòu)造新的日志文件名,格式為:file_monitor_序號.log
        QString logFileName = "file_monitor_" + QString::number(currentLogFileIndex) + ".log";
        currentLogFile.setFileName(logFileName);

        // 如果日志文件已經(jīng)存在,獲取其大小并更新當(dāng)前日志文件大小變量
        if (currentLogFile.exists()) {
            currentLogFileSize = currentLogFile.size();
        } else {
            currentLogFileSize = 0;
        }

        // 打開或創(chuàng)建日志文件,如果失敗則輸出錯誤信息
        if (!currentLogFile.open(QIODevice::Append | QIODevice::Text)) {
            std::cerr << "Failed to open/create log file: " << qPrintable(logFileName) << std::endl;
        }
    }

    // 記錄日志事件的函數(shù)
    void logEvent(const QString &event, const QString &path) {
        // 創(chuàng)建文本流對象,用于向當(dāng)前日志文件寫入內(nèi)容
        QTextStream out(&currentLogFile);
        // 寫入當(dāng)前日期時間、事件類型和文件路徑信息到日志文件
        out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
            << " - " << event << ": " << path << "\n";
        currentLogFile.flush();

        // 計算剛寫入的日志字符串的大小,先讀取文本流中的內(nèi)容
        QString logString = out.readAll();
        // 如果讀取為空,說明可能是因為剛剛寫入還未緩存,重新構(gòu)造日志字符串
        if (logString.isEmpty()) {
            logString = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
                        + " - " + event + ": " + path + "\n";
        }

        // 更新當(dāng)前日志文件的大小,將日志字符串轉(zhuǎn)換為UTF-8編碼后計算其字節(jié)數(shù)并累加到當(dāng)前日志文件大小變量
        currentLogFileSize += logString.toUtf8().size();

        // 檢查當(dāng)前日志文件大小是否達到單個日志文件大小限制
        if (currentLogFileSize >= logFileSizeLimit) {
            // 關(guān)閉當(dāng)前日志文件
            currentLogFile.close();

            // 增加日志文件索引,用于創(chuàng)建下一個新的日志文件
            ++currentLogFileIndex;

            // 檢查是否超過了總?cè)罩疚募笮∠拗?,如果超過則刪除最早的日志文件
            if (currentLogFileIndex * logFileSizeLimit > totalLogSizeLimit) {
                QString oldestLogFileName = "file_monitor_" + QString::number(currentLogFileIndex - totalLogSizeLimit / logFileSizeLimit) + ".doc";
                if (QFile::exists(oldestLogFileName)) {
                    QFile::remove(oldestLogFileName);
                }
            }

            // 創(chuàng)建新的日志文件
            createNewLogFile();
        }
    }

    // 文件系統(tǒng)監(jiān)控器對象,用于監(jiān)控指定路徑下的文件和目錄變化
    QFileSystemWatcher *watcher;
    // 監(jiān)控的根路徑
    QString rootPath;
    // 初始的文件列表,用于對比檢測文件的新增和刪除情況
    QStringList initialFiles;

    // 以下是新增的日志管理相關(guān)成員變量

    // 當(dāng)前正在使用的日志文件對象
    QFile currentLogFile;
    // 單個日志文件的大小限制,單位為字節(jié)
    quint64 logFileSizeLimit;
    // 總?cè)罩疚募笮∠拗?,單位為字?jié)
    quint64 totalLogSizeLimit;
    // 當(dāng)前日志文件的索引,用于區(qū)分不同的日志文件
    quint64 currentLogFileIndex;
    // 當(dāng)前日志文件的大小,單位為字節(jié),用于實時監(jiān)控文件大小是否達到限制
    quint64 currentLogFileSize;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 獲取命令行參數(shù),如果有參數(shù)則將其作為監(jiān)控路徑,否則默認監(jiān)控根目錄
    QString watchPath = (argc > 1)? QString::fromLocal8Bit(argv[1]) : "/";

    // 創(chuàng)建文件監(jiān)控對象,傳入監(jiān)控路徑
    FileMonitor monitor(watchPath);

    // 運行應(yīng)用程序的事件循環(huán),開始監(jiān)控文件和目錄變化并記錄日志
    return a.exec();
}

#include "main.moc"

到此這篇關(guān)于Qt實現(xiàn)日志文件的滾動寫入的文章就介紹到這了,更多相關(guān)Qt日志文件滾動寫入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++分布式語音識別服務(wù)實踐方案

    C++分布式語音識別服務(wù)實踐方案

    最近基于C++實現(xiàn)了一個分布式語音識別子服務(wù),核心目標(biāo)是提供高可用的 RPC 接口,支持客戶端上傳 PCM 音頻文件并返回識別結(jié)果,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • 使用C語言解決字符串匹配問題的方法

    使用C語言解決字符串匹配問題的方法

    這篇文章主要介紹了使用C語言解決字符串匹配問題的方法,包括一道實例練習(xí)題,需要的朋友可以參考下
    2015-08-08
  • C++動態(tài)內(nèi)存管理詳解

    C++動態(tài)內(nèi)存管理詳解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++動態(tài)分配內(nèi)存的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • 詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    這篇文章主要為大家介紹了C語言基礎(chǔ)的類型轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出

    C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出

    這篇文章主要介紹了C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • c++11&14-多線程要點匯總

    c++11&14-多線程要點匯總

    這篇文章主要介紹了c++11&14-多線程的使用方法,文中代碼非常詳細,方便大家更好的參考和學(xué)習(xí),感興趣的朋友快來了解下
    2020-06-06
  • C++11新特性之列表初始化的具體使用

    C++11新特性之列表初始化的具體使用

    在我們實際編程中,我們經(jīng)常會碰到變量初始化的問題,本文主要介紹了C++11新特性之列表初始化的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++順序表實現(xiàn)圖書管理系統(tǒng)

    C++順序表實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++順序表實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程

    C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程

    動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存
    2022-03-03

最新評論

栖霞市| 望谟县| 达日县| 余庆县| 财经| 固镇县| 镇江市| 诏安县| 永春县| 浦江县| 太仆寺旗| 巴彦县| 佛学| 靖远县| 班玛县| 福州市| 灵丘县| 株洲市| 垣曲县| 三门峡市| 政和县| 伊宁市| 柘荣县| 奎屯市| 榆树市| 安阳市| 武定县| 怀柔区| 克山县| 莲花县| 翁源县| 旬阳县| 元氏县| 平乡县| 育儿| 兰溪市| 来安县| 兖州市| 濮阳市| 安阳县| 鄄城县|