C++ logger的异步日志记录

avatar
作者
猴君
阅读量:0

在C++中实现异步日志记录通常使用多线程来实现。以下是一个简单的示例代码:

#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类包含一个日志队列logQueue,一个互斥锁mutex和一个条件变量cv。日志消息通过log()方法添加到队列中,在logWorker()方法中的工作线程中从队列中取出消息,并将其写入日志文件中。当程序结束时,Logger类的析构函数会关闭日志文件并等待工作线程结束。

在主函数中,创建一个Logger实例,并使用log()方法记录日志消息。由于日志记录是在后台线程中进行的,不会阻塞主线程。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!