C++实现一个异步日志库

news2024/11/17 22:21:42

C++实现一个异步日志库

  • 一、概念
  • 二、代码实现
  • 三、小结

一、概念

异步日志库(Asynchronous Logging Library)是一种用于记录应用程序运行时信息的库。相比于同步日志库,异步日志库能够提供更高的性能和可扩展性,因为它使用了异步写入和缓冲技术。

在异步日志库中,应用程序会将日志消息发送到一个缓存队列中,而不是直接写入到磁盘中。这样可以避免频繁的 I/O 操作,提高写入效率。同时,异步日志库还支持多线程并发写入,大大提高了并发处理能力。

另外,异步日志库通常也提供了丰富的日志级别和过滤功能,可以让开发人员方便地控制日志输出量和质量,从而更好地进行调试和排错工作。

异步日志库已经被广泛地应用于各种类型的应用程序中,包括 Web 服务器、数据库、游戏等。其中,最著名的异步日志库之一就是 Facebook 的 folly logging library。

二、代码实现

以下是一个简单的C++异步日志库实现,它可以支持多线程写入日志,并且将日志记录到单独的文件中:

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

class AsyncLogger {
public:
    AsyncLogger(const std::string& filename) : m_file(filename), m_isRunning(true),
        m_worker(std::bind(&AsyncLogger::logWorker, this)) {}

    ~AsyncLogger() {
        m_isRunning = false;
        m_cv.notify_one();
        m_worker.join();
    }

    void log(const std::string& message) {
        std::unique_lock<std::mutex> lock(m_mutex);
        m_queue.push(message);
        lock.unlock();
        m_cv.notify_one();
    }

private:
    void logWorker() {
        while (m_isRunning) {
            std::unique_lock<std::mutex> lock(m_mutex);
            m_cv.wait(lock, [&](){ return !m_queue.empty() || !m_isRunning; });
            while (!m_queue.empty()) {
                auto message = m_queue.front();
                m_queue.pop();
                lock.unlock();
                m_file << message << std::endl;
                lock.lock();
            }
        }
    }

    std::ofstream m_file;
    bool m_isRunning;
    std::queue<std::string> m_queue;
    std::mutex m_mutex;
    std::condition_variable m_cv;
    std::thread m_worker;
};

int main() {
    AsyncLogger logger("logfile.txt");

    // Start multiple threads to write logs
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back([&logger, i]() {
            for (int j = 0; j < 10; ++j) {
                logger.log("Thread " + std::to_string(i) + " log " + std::to_string(j));
            }
        });
    }

    // Wait for all threads to finish
    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

在上面的代码中,我们首先定义了一个AsyncLogger类来封装异步日志的实现。该类内部维护了一个字符串队列和一个工作线程,该线程不断地从队列中取出日志消息并写入到文件中。

在log函数中,我们将要写入的日志消息添加到队列中,并通过条件变量通知工作线程进行处理。在工作线程中,我们使用std::unique_lock和std::condition_variable来实现线程安全的队列操作,并不断地循环处理队列中的消息,直到队列为空或者程序退出为止。

最后,在主函数中,我们创建了多个线程来并发地写入日志,然后等待所有线程执行完毕后再退出程序。

三、小结

异步日志和同步日志是指在写入日志时,日志系统和应用程序之间的交互方式不同。

异步日志:应用程序将日志消息发送到一个缓存队列中,日志系统从队列中读取日志消息并将其写入磁盘。应用程序不需要等待日志系统完成写操作,可以继续执行其他操作。该方式的优点是减少了应用程序的阻塞时间,提高了应用程序的性能,但也可能会存在一定的数据丢失风险。

同步日志:应用程序在发送日志消息后,必须等待日志系统完成写操作后才能继续执行。该方式可以保证数据的完整性和准确性,减少了数据丢失的风险,但也会导致应用程序的性能下降,特别是在高并发场景下。

总体来说,异步日志适用于对实时性要求较高、但对数据完整性要求相对较低的场景;同步日志适用于对数据完整性和准确性要求较高的场景。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈 地下水数值模拟Visual modflow Flex

Visual MODFLOW Flex是行业标准规范软件&#xff0c;将地下水流和污染物运移、基本分析和校准工具&#xff0c;以及强大的三维可视化功能集成在一个单一的&#xff0c;易于使用的软件环境中。 使用Visual MODFLOW Flex&#xff0c;用户将拥有所有的工具&#xff0c;可用来解决…

单点性能测试-页面Load时间

打开chrome浏览器的调试工具&#xff0c;如图所示&#xff1a; DOMContentLoaded&#xff1a;DOM树构建完成。即HTML页面由上向下解析HTML结构到末尾封闭标签的时间 Load:页面加载完成的时间。 DOM树构建完成后&#xff0c;继续加载html/css 中的图片、音频、视频等等外部资源…

用Python在25行以下代码实现人脸识别

** OpenCV ** OpenCV是最流行的计算机视觉库。最初是用C/C编写的&#xff0c;现在它提供了Python的API。 OpenCV使用机器学习算法来搜索图片中的面孔。因为脸是如此复杂&#xff0c;没有一个简单的测试可以告诉你它是否找到了一张脸。相反&#xff0c;有成千上万的小模式和特…

08-Vue技术栈之过度与动画

目录 1、作用2、写法3、动画的应用4、过度的应用5、animate.css动画库的使用 1、作用 在插入、更新或移除 DOM元素时&#xff0c;在合适的时候给元素添加样式类名。 图示&#xff1a; 2、写法 准备好样式&#xff1a; 元素进入的样式&#xff1a; v-enter&#xff1a;进入的…

U-boot 的使用

编译U-Boot A. 首先在 Ubuntu 中安装 ncurses 库&#xff0c;否则编译会报错&#xff0c;安装命令如下&#xff1a; sudo apt-get install libncurses5-dev B. 解压缩&#xff1a; tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 C. 手工编译 uboot&#xff1a; make …

系统日志规范及最佳实践

作者&#xff1a;蓝旺 打印日志是一门艺术&#xff0c;日志信息是开发人员排查线上问题最主要的手段之一&#xff0c;但规范打日志被开发同学经常所忽视。日志就像保险&#xff0c;平时正常的时候用不上&#xff0c;但是一旦出问题就都想看有没有保险可以用。一条良好的日志&am…

4款不错的UI设计软件推荐

俗话说&#xff0c;如果工人想做好工作&#xff0c;他们必须首先磨利他们的工具。高质量的UI设计软件将使设计事半功倍。 近年来&#xff0c;UI设计软件的逐渐多样化&#xff0c;让一些需要使用UI设计软件的小伙伴不知道如何选择。 我整理了四款优秀的免费UI设计软件。别错过…

【C++】STL标准库之deque

STL标准库之deque 双端队列deque的介绍双端队列的底层结构双端队列的迭代器双端队列的缺陷为何将双端队列作为栈和队列的底层默认容器 双端队列deque的介绍 双端队列和我们常见的队列或者优先级队列不同&#xff0c;双端队列是一种双开口的连续空间的数据结构。双开口意味着它可…

盘点好用的3D渲染软件,哪个更适合你?

3D 渲染软件可以帮助建筑师和设计专业人士通过逼真的图像或视频将他们的 3D 模型变为现实&#xff0c;相信许多刚刚接触渲染行业的小伙伴都会有一个疑问&#xff0c;那就是五花八门的各色渲染软件&#xff0c;我究竟用哪个比较好&#xff1f;其实&#xff0c;选择3D渲染器主要还…

每日一题——反转字符串中的单词

每日一题 反转字符串中的单词 题目链接 思路&#xff08;进阶&#xff09; 我们首先不考虑太多限制因素&#xff0c;先看如何实现字符串中单词的反转 举个例子&#xff1a;我们要反转字符串“the sky is blue”中的单词&#xff0c;我们可以先将字符串中的每个字符反转“eht …

APP渗透—微信小程序、解包反编译、数据抓包

APP渗透—微信小程序、解包反编译、数据抓包 1. 前言2. 小程序抓包2.1. 安卓系统5.0版本测试2.1.1. 添加模拟器2.1.2. 安装证书2.1.2.1. 确保在同一局域网2.1.2.2. 设置burp工具2.1.2.3. 设置模拟器代理2.1.2.4. 下载证书2.1.2.5. 修改证书2.1.2.6. 安装证书 2.1.3. 抓包测试 2…

基于海鸥算法改进的随机森林回归算法 - 附代码

基于海鸥算法改进的随机森林回归算法 - 附代码 文章目录 基于海鸥算法改进的随机森林回归算法 - 附代码1.数据集2.RF模型3.基于海鸥算法优化的RF4.测试结果5.Matlab代码6.Python代码 摘要&#xff1a;为了提高随机森林数据的回归预测准确率&#xff0c;对随机森林中的树木个数和…

【机器学习】决策树如何实现回归

【机器学习】决策树如何实现回归 文章目录 【机器学习】决策树如何实现回归1. 介绍2. 回归树的构建方法3. 递归二分法4. 回归树的剪枝5. 总结参考 1. 介绍 在 https://blog.csdn.net/qq_51392112/article/details 中&#xff0c;我们详细介绍了决策树基本内容&#xff1a;如何…

Visual Studio搭建Linux环境

环境&#xff1a;ubantu22.04.2 Visual Studio2019 可以先参考这个文章 微软官网 1.在配置之前需要搭建好远程Linux系统的环境需要安装penssh-server、gdb、gdbserver&#xff1a; sudo apt-get install openssh-server sudo apt-get install gdb gdbserver2.然后启动ssh服务 …

Filename: “/usr/local/flexlm/licenses/license.dat“

故障现象1&#xff1a;学习安装vcs时&#xff0c;出现如下打印&#xff1a; 8:30:51 (lmgrd) Servers System Date and Time: Fri May 05 2023 08:30:51 EDT 8:30:51 (lmgrd) SLOG: Summary LOG statistics is enabled. 8:30:51 (lmgrd) license manager: cant initialize:Ca…

K8S管理系统项目实战[API开发]

前端: Vueelement plus 后端: gogin 后端 Go 快速入门 Gin Web框架 K8s管理系统项目实战[API开发] 项目背景&#xff0c;整体设计&#xff0c;Client-go&#xff0c;框架搭建 一、项目背景 随着容器技术的广泛应用&#xff0c;kubernetes逐渐成为业内的核心技术&#xf…

【SpringBoot】SpringBoot集成ElasticSearch

文章目录 第一步&#xff0c;导入jar包&#xff0c;注意这里的jar包版本可能和你导入的不一致&#xff0c;所以需要修改第二步&#xff0c;编写配置类第三步&#xff0c;填写yml第四步&#xff0c;编写util类第五步&#xff0c;编写controller类第六步&#xff0c;测试即可 第一…

黎曼几何与黎曼流形

目录 0.黎曼几何 1. 欧几里得几何与黎曼几何的区别 2.黎曼流形 3.黎曼距离 4.切空间 5.黎曼均值 6. SPD矩阵如何形成黎曼流型 7.切线空间映射 8.同余变换和同余不变 9.黎曼对齐 科普性笔记&#xff0c;做了解&#xff0c;不深入。 0.黎曼几何 黎曼几何是一种基于欧几…

MySQL 表操作

目录 创建表 案例 查看表结构 修改表 案例&#xff1a; 删除表 创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a; field 表示列名 dat…

【Vue学习笔记3】使用Vite开启一个Vue3工程项目

1. 什么是Vite? Vite是一个web开发构建工具。Vite 的竞品是 Webpack&#xff0c;而且按照现在的趋势看&#xff0c;使用率超过 Webpack 也是早晚的事。 Vite 主要提升的是开发的体验&#xff0c;Webpack启动调试环境需要 3 分钟都很常见&#xff0c;Vite大大缩短了这个时间。…