基于现有日志系统的功能扩展方案

# 基于现有日志系统的功能扩展方案(直接可落地、可写代码)

我按常用扩展方向讲,每个给思路 + 可直接加的代码片段,适配你上面那套单例日志框架。

一、最常用必加扩展

1. 日志等级过滤(只输出≥指定级别日志)

需求 :发布版屏蔽 Debug,只输出 Info/Warn/Error
实现

在 Logger 类加成员:

cpp 复制代码
private:
    LogLevel m_minLevel = DEBUG; // 默认全开
public:
    void setMinLevel(LogLevel level) { m_minLevel = level; }

log() 开头加判断:

cpp 复制代码
if (level < m_minLevel) return;

示例:发布时 Logger::instance().setMinLevel(INFO); 自动屏蔽 DEBUG


2. 日志文件按日期分割(自动生成 2025-05-23.log)

思路:每次写日志判断日期变化,自动新建文件

  • 获取当前日期,拼接文件名 log_YYYY-MM-DD.log
  • 日期变了就 close 旧文件、open 新文件

加成员

cpp 复制代码
std::string m_curDate;

在 log 里获取当前日期,和 m_curDate 对比,不一致就切文件。


3. 日志文件大小分割(单个文件超 5MB 新建)

需求:防止单个日志太大

  • 记录当前文件大小
  • 超过阈值自动新建 app_1.log、app_2.log

4. 关闭控制台输出 / 只输出文件

加开关:

cpp 复制代码
bool m_enableConsole = true;
bool m_enableFile = true;
void setConsoleEnable(bool b) { m_enableConsole = b; }
void setFileEnable(bool b) { m_enableFile = b; }

log 里判断开关再输出。


二、高级功能扩展(项目级必备)

5. 异步日志(解决多线程大量打印卡顿)

问题 :大量日志时文件 IO 阻塞主线程
方案

  • 生产者消费者队列
  • 日志丢进队列,后台线程统一写文件
  • 加线程安全队列、条件变量

6. 模块标签(区分网络、数据库、UI、业务)

扩展宏:

cpp 复制代码
#define LOGD_MOD(mod, ...) Logger::instance().log(DEBUG, mod, __FILE__, __LINE__, __VA_ARGS__)
// 使用
LOGD_MOD("NET", "收到数据包");

日志格式:[时间][DEBUG][NET][main.cpp:20] xxx

7. 堆栈信息打印(崩溃时输出调用栈)

  • Windows:StackWalk64
  • Linux:backtrace()
    FATAL 日志自动打印堆栈。

8. 日志缓存、批量刷盘

频繁 flush 慢,改为缓冲区满/定时刷新,提升性能。

9. 自定义格式(时间格式、是否显示行号)

加配置项:

cpp 复制代码
bool m_showFileLine = true;
bool m_showTime = true;

10. 日志加密、压缩、自动清理旧日志

  • 自动删除 7 天前日志
  • 大日志自动压缩成 zip

三、架构扩展(工程化)

  1. 支持多输出目标:控制台 + 文件 + 网络(远程日志服务器)
  2. 配置文件驱动:读取 log_config.json 控制级别、路径、分割策略
  3. 支持 JSON 格式日志,方便 ELK 收集
  4. DLL 封装,其他模块直接调用

四、我可以直接帮你升级完整版本

你告诉我想要哪些,我一次性给你完整可编译的增强版代码

  1. 等级过滤
  2. 按日期切日志
  3. 模块标签
  4. 异步日志
  5. 控制台开关
  6. 自动清理旧日志

直接选序号,我给你写成品代码。(直接可落地、可写代码)

一、最常用必加扩展

1. 日志等级过滤(只输出≥指定级别日志)

需求 :发布版屏蔽 Debug,只输出 Info/Warn/Error
实现

在 Logger 类加成员:

cpp 复制代码
private:
    LogLevel m_minLevel = DEBUG; // 默认全开
public:
    void setMinLevel(LogLevel level) { m_minLevel = level; }

log() 开头加判断:

cpp 复制代码
if (level < m_minLevel) return;

示例:发布时 Logger::instance().setMinLevel(INFO); 自动屏蔽 DEBUG


2. 日志文件按日期分割(自动生成 2025-05-23.log)

思路:每次写日志判断日期变化,自动新建文件

  • 获取当前日期,拼接文件名 log_YYYY-MM-DD.log
  • 日期变了就 close 旧文件、open 新文件

加成员

cpp 复制代码
std::string m_curDate;

在 log 里获取当前日期,和 m_curDate 对比,不一致就切文件。


3. 日志文件大小分割(单个文件超 5MB 新建)

需求:防止单个日志太大

  • 记录当前文件大小
  • 超过阈值自动新建 app_1.log、app_2.log

4. 关闭控制台输出 / 只输出文件

加开关:

cpp 复制代码
bool m_enableConsole = true;
bool m_enableFile = true;
void setConsoleEnable(bool b) { m_enableConsole = b; }
void setFileEnable(bool b) { m_enableFile = b; }

log 里判断开关再输出。


二、高级功能扩展(项目级必备)

5. 异步日志(解决多线程大量打印卡顿)

问题 :大量日志时文件 IO 阻塞主线程
方案

  • 生产者消费者队列
  • 日志丢进队列,后台线程统一写文件
  • 加线程安全队列、条件变量

6. 模块标签(区分网络、数据库、UI、业务)

扩展宏:

cpp 复制代码
#define LOGD_MOD(mod, ...) Logger::instance().log(DEBUG, mod, __FILE__, __LINE__, __VA_ARGS__)
// 使用
LOGD_MOD("NET", "收到数据包");

日志格式:[时间][DEBUG][NET][main.cpp:20] xxx

7. 堆栈信息打印(崩溃时输出调用栈)

  • Windows:StackWalk64
  • Linux:backtrace()
    FATAL 日志自动打印堆栈。

8. 日志缓存、批量刷盘

频繁 flush 慢,改为缓冲区满/定时刷新,提升性能。

9. 自定义格式(时间格式、是否显示行号)

加配置项:

cpp 复制代码
bool m_showFileLine = true;
bool m_showTime = true;

10. 日志加密、压缩、自动清理旧日志

  • 自动删除 7 天前日志
  • 大日志自动压缩成 zip

三、架构扩展(工程化)

  1. 支持多输出目标:控制台 + 文件 + 网络(远程日志服务器)
  2. 配置文件驱动:读取 log_config.json 控制级别、路径、分割策略
  3. 支持 JSON 格式日志,方便 ELK 收集
  4. DLL 封装,其他模块直接调用

相关推荐
2601_9663771311 分钟前
云上系统零改造过密评|数达安全发布通关四件套
网络·安全
bksczm40 分钟前
Linux 五种 I/O 模型与多路复用详解
运维·服务器·网络
蒸蒸yyyyzwd1 小时前
cpp选手秋招学习笔记day24-cs144项目总结
运维·服务器·网络
数据知道2 小时前
静态分析入门——PE 结构、字符串、导入表快速定性
网络·安全·web安全·网络安全
CCYe、2 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
葡萄城技术团队2 小时前
从设备协议数据到完整OEE:机加工车间设备效率分析的技术实现路径
网络
码农小麦3 小时前
LangChain 1.3.18 + DeepSeek-v4-flash 工具调用踩坑实录
网络·数据库·langchain
吴声子夜歌3 小时前
Guava——事件总线
java·网络·guava
比兔代理3 小时前
住宅代理IP的出口节点调度:ASN、BGP 与 IP 段信誉机制解析
linux·服务器·网络
AAA代码批发商3 小时前
DAYS 38 TCP并发服务器模型详解
linux·网络·笔记·学习