首页 > 其他分享 >利用单例模式与阻塞队列实现异步的日志系统,记录服务器运行状态

利用单例模式与阻塞队列实现异步的日志系统,记录服务器运行状态

时间:2024-03-03 20:45:24浏览次数:25  
标签:异步 文件 写入 线程 单例 日志

目录


Log 类是一个用于日志记录的C++类,其设计具有以下特点和功能:

类结构概述

  • 类成员变量

    • path_: 日志文件存储路径。
    • suffix_: 日志文件后缀名。
    • MAX_LINES_: 每个日志文件允许的最大行数。
    • lineCount_: 当前日志文件已写的行数。
    • toDay_: 当前日志文件对应的日期。
    • isOpen_: 表示日志系统是否已开启。
    • buff_: 缓冲区,用于暂存待写入文件的日志内容。
    • level_: 当前日志级别。
    • isAsync_: 标记是否启用异步写入。
    • fp_: 指向日志文件的FILE指针。
    • deque_: 一个阻塞队列,用于在异步模式下存放待写入日志的字符串。
    • writeThread_: 异步写入线程的智能指针。
    • mtx_: 互斥锁,用于保证多线程环境下的日志写入操作线程安全。
  • 构造函数

    • 私有的构造函数,确保类只能通过单例模式访问。
  • 初始化方法

    • init 方法接收日志级别、日志路径、文件后缀名和最大队列容量参数,用于初始化日志系统,包括创建文件、设置日志级别以及开启异步写入线程(如果需要的话)。
  • 静态方法

    • Instance() 方法提供单例模式访问,返回唯一实例。
    • FlushLogThread() 方法启动一个线程用于异步写入日志。
  • 日志写入与管理方法

    • write 方法接受日志级别和格式化的日志内容,并负责将日志写入缓冲区或者直接写入文件,或者放入异步队列中。
    • flush 方法用于将缓冲区中的日志内容强制写入文件,并刷新文件流。
    • AsyncWrite_ 是异步写入线程内部调用的方法,用于从队列中取出日志内容并写入文件。
    • GetLevelSetLevel 方法分别用于获取和设置日志级别。
    • IsOpen 方法检查日志系统是否已开启。
  • 日志文件切分

    • 类还包含了处理日志文件按天切分的逻辑,当日历日期改变时,会自动创建新的日志文件。
  • 宏定义

    • 定义了 LOG_DEBUGLOG_INFOLOG_WARNLOG_ERROR 四个宏,方便快捷地记录不同级别的日志信息。

主要特性总结

  1. 日志级别控制:可以通过设置日志级别来控制输出的日志内容。
  2. 异步写入支持:可以选择启用异步写入,提高日志记录效率,降低日志写入对主线程性能的影响。
  3. 日志文件管理:能够按天自动切分日志文件,并保证日志文件大小在一定范围内。
  4. 线程安全:通过互斥锁保护共享资源,使得多线程环境下日志记录依然有序和可靠。
  5. 单例模式:采用单例模式保证在整个程序生命周期内只存在一个全局的日志对象,便于统一管理和资源控制。

标签:异步,文件,写入,线程,单例,日志
From: https://www.cnblogs.com/yubo-guan/p/18050675

相关文章

  • 网页浏览器Chrome开发者调试工具-Source(源码)-断点调试、条件断点、日志断点
    前言全局说明网页浏览器Chrome开发者调试工具-Source(源码)-断点调试、条件断点、日志断点断点,是某行代码要执行,还没有执行的一个暂停点一、截图对照1.1Chrome浏览器1.1.1蓝色,普通断点1.1.2设置断点类型图中分别是:backpoint:普通断点(蓝色)Conditionalbreakp......
  • Windows 系统日志是记录操作系统活动的重要组成部分,对于入侵排查和溯源来说,分析系统日
    Windows系统日志是记录操作系统活动的重要组成部分,对于入侵排查和溯源来说,分析系统日志是非常关键的一步。以下是针对Windows系统日志分析和溯源的基础技术原理:事件日志:Windows操作系统生成多个类型的事件日志,包括应用程序日志、安全日志和系统日志。了解不同类型的事件日......
  • 一文搞懂 Go 1.21 的日志标准库 - slog
    一文搞懂Go1.21的日志标准库-slog原创 rubys_ awk 2024-01-3120:20 广东 1人听过在过去多年里,我们在Go中写日志的时候,通常都是使用 Zerolog 或者 Zap 这两个包。在本文中,我们将重点探讨Go最近引入的 log/slog 包,该包旨在将高性能、结构化和分级日志......
  • 在K8S中,如何使用 EFK 实现日志的统一管理?
    在Kubernetes(K8s)中,EFK(Elasticsearch,Fluentd,Kibana)是一种常见的日志统一管理方案。EFK堆栈允许你收集、存储、搜索、分析和可视化容器化应用程序的日志。下面是如何在Kubernetes中使用EFK实现日志统一管理的详细步骤:1.部署ElasticsearchElasticsearch是一个分布式、RESTful......
  • Python日志logging模块
    Python日志logging模块logging---Python的日志记录工具—Python3.12.2文档Pythonlogging模块的基本使用、进阶使用详解_python中logging模块详解-CSDN博客logging模块架构日志级别默认的级别是“WARNING“,意味着只会追踪该级别及以上的事件。级别何时使用......
  • 第二十八:日志服务管理
    一、系统日志介绍在现实生活中,记录日志非常重要﹐比如:银行转账时会有转账记录﹔飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程.那么将系统和应用发生的事件记录至日志中,也很意义,常可以助于排错和分析使用日志记录的内容包括:历史事件:时间,地点,人物,事件......
  • (笔记)Linux下glog日志库的详细使用方法
     Glog是一个开源的C++日志库,它提供了非常方便的日志记录功能。下面是使用Glog的详细步骤: 一、安装Glog库您可以从Glog的官方网站(https://github.com/google/glog)下载Glog的源代码,然后进行编译和安装。在Linux系统下,您可以使用以下命令安装Glog库:sudoapt-getinstalllibg......
  • 浮木云学习日志(9)---模块统计设计
    ​在SaaS系统中,统计模块是非常重要的一个功能。对于C端产品,可能会展示用户个人使用数据,比如Keep中的锻炼时长统计。虽然这些数据只是供用户了解自己的使用情况,并非必需。然而,在B端的SaaS系统中,由于用户众多且业务复杂,公司管理层需要查看全公司数据和员工绩效情况。因此,SaaS系统必......
  • Android 《SQLite 异步操作》
    一、数据库升级随着我们系统的升级,数据库一般也要跟着一起变化。Android中的SQLite数据库根据数据库版本号来判断是否进行了升级。当数据库版本号发生变化后,Android系统会调用SQLiteOpenHelper的ouUpgrade函数,然后我们在该函数中对版本号进行判断,再根据版本号执行对应的......
  • 在K8S中,如何查看kubelet组件的日志?
    在Kubernetes(K8S)中,查看kubelet组件的日志可以通过几种不同的方法。以下是详细的步骤:使用journalctl命令:如果kubelet是通过systemd方式部署的,你可以使用journalctl命令来查看其日志。执行journalctl-ukubelet将显示kubelet的日志信息。如果需要查看实时更新的日志,可以添加-f......