# 日志系统 **Repository Path**: HushNow_H/logging-system ## Basic Information - **Project Name**: 日志系统 - **Description**: C++ --- 基于多设计模式下的同步&异步⽇志系统 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-10-26 - **Last Updated**: 2023-10-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 日志系统 #### 介绍 C++ --- 基于多设计模式下的同步&异步⽇志系统 #### 项目介绍 此项目主要实现⼀个⽇志系统,其主要⽀持以下功能: • ⽀持多级别⽇志消息 • ⽀持同步⽇志和异步⽇志 • ⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中 • ⽀持多线程程序并发写⽇志 • ⽀持扩展不同的⽇志落地⽬标地 #### 开发环境 • VsCode • CentOS7 • Makefile • g++ #### 核心技术 • 类层次设计 • C++11 • 双缓冲区 • ⽣产消费模型 • 多线程 • 设计模式 • 多线程 • 智能指针 #### 模块介绍 1. 实用工具类的实现 1)获取系统时间 2)判断文件是否存在 3)获取文件所在路径 4)创建目录 2. 日志等级模块 1)定义出日志系统所包含的所以日志等级 UNKNOW = 0 DEBUG, 调试等级的日志 INFO, 提示等级的日志 WARN, 警告等级的日志 ERROR, 错误等级的日志 FATAL, 致命错误等级的日志 OFF, 设置成off时,所以日志都不能输出,等级最大 每一个项目中都会设置一个默认的日志输出等级,只有输出的日志等级大于等于默认限制等级的时候才可以进行输出 2)提供一个接口,将对应等级的枚举,转换为一个对应的字符串 如:DEBUG ---> "DEBUG" 3. 日志消息模块 意义:中间存储一条日志消息所需的各项要素 1)日志的输出时间:用于过滤日志输出时间 2)日志等级:用于进行日志过滤分析 3)源文件名称 4)源代码行号:用于定义出现错误的代码位置 5)线程ID:用于过滤出错的线程 6)日志主体消息 7)日志器名称(当前支持多日志器的同时使用) 4. 日志格式化模块 作用:对日志消息进行格式化,组织称为指定格式的字符串 - %d 日期 - %T 缩进 - %t 线程id - %p 日志级别 - %c 日志器名称 - %f 文件名 - %l 行号 - %m 日志消息 - %n 换行 [%d{%H:%M:%S}][%t][%c][%p][%f:%l]%T%m%n LogMsg { time_t _ctime = 111111 LogLevel::value _level = DEBUG size_t _line = 53 std::thread::id _tid = 12345678 std::string _file = main.c std::string _logger = root std::string _payload= "套接字创建失败..." } [18:23:54][12345678][root][DEBUG][main.c:53] 套接字创建失败...\n 格式化字符串控制了日志的输出格式 定义格式化字符,是为了让日志系统进行日志格式化更加的灵活方便 成员: 1)格式化字符串 2)格式化子项数组:对格式化字符串进行解析,保存了日志消息要素的排序 不同的格式化子项,会从日志消息中取出指定的元素,转换为字符串 [%d{%H:%M%S}][%f:%l] %m%n 格式化子项: 1)其他信息(非格式化字符)子项:[ 2)日期子项:%H:%M:%S 3)其他信息子项:] 4)其他信息子项:[ 5)文件名子项: 6)其他信息子项:: 7)其他信息子项:] 8)消息主体子项: 9)换行子项 [12:53:24][main.c:53] 套接字创建失败...\n 需要先完成的:格式化子项类的定义与实现 格式化子项的实现思想: 作用:从日志消息中取出指定的元素,追加到一块内存空间中 class MsgFormatltem { public: void format(std::ostream &out, LogMsg &msg) { out<