C++ logger的異步日志記錄

c++
小樊
82
2024-08-23 13:13:30

在C++中實(shí)現(xiàn)異步日志記錄通常使用多線程來實(shí)現(xiàn)。以下是一個(gè)簡(jiǎn)單的示例代碼:

#include <iostream>
#include <fstream>
#include <string>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>

class Logger {
public:
    Logger() : isRunning(true) {
        outputFile.open("log.txt", std::ios::app);
        workerThread = std::thread(&Logger::logWorker, this);
    }

    ~Logger() {
        isRunning = false;
        workerThread.join();
        outputFile.close();
    }

    void log(const std::string& message) {
        std::lock_guard<std::mutex> lock(mutex);
        logQueue.push(message);
        cv.notify_one();
    }

private:
    std::ofstream outputFile;
    std::queue<std::string> logQueue;
    std::mutex mutex;
    std::condition_variable cv;
    bool isRunning;
    std::thread workerThread;

    void logWorker() {
        while (isRunning) {
            std::unique_lock<std::mutex> lock(mutex);
            cv.wait(lock, [this] { return !logQueue.empty() || !isRunning; });

            while (!logQueue.empty()) {
                std::string message = logQueue.front();
                logQueue.pop();
                outputFile << message << std::endl;
            }
        }
    }
};

int main() {
    Logger logger;

    logger.log("Hello, World!");
    logger.log("This is a log message.");

    return 0;
}

在上面的示例中,Logger類包含一個(gè)日志隊(duì)列logQueue,一個(gè)互斥鎖mutex和一個(gè)條件變量cv。日志消息通過log()方法添加到隊(duì)列中,在logWorker()方法中的工作線程中從隊(duì)列中取出消息,并將其寫入日志文件中。當(dāng)程序結(jié)束時(shí),Logger類的析構(gòu)函數(shù)會(huì)關(guān)閉日志文件并等待工作線程結(jié)束。

在主函數(shù)中,創(chuàng)建一個(gè)Logger實(shí)例,并使用log()方法記錄日志消息。由于日志記錄是在后臺(tái)線程中進(jìn)行的,不會(huì)阻塞主線程。

0