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

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

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

一、最常用必加扩展

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 封装,其他模块直接调用

相关推荐
玖玥拾10 分钟前
Unity 3D 笔记(十二)Unity/C# Socket 网络笔记1
网络·unity·c#
2401_8919573128 分钟前
简单了解传输层协议UDP
网络·网络协议·udp
AvatarAI_Walker42 分钟前
2026年7月安徽本地健康IP孵化行业观察:不同需求下的服务方向梳理
大数据·网络·tcp/ip·搜索引擎·精选
一棵星43 分钟前
WebSocket 长连接不稳?一次完整的排查与修复之旅
网络·websocket·网络协议
发量惊人的中年网工44 分钟前
AI服务器托管怎么选机房?GPU集群对机柜、电力和网络的硬要求
服务器·网络·人工智能
玖玥拾1 小时前
Unity 3D 笔记(十五)Unity/C# Socket 网络笔记4
服务器·网络·unity·c#
JackieDYH1 小时前
WebSocket-不同平台封装-Hooks和使用案例
网络·websocket·网络协议
andxe12 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一13 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈14 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习