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

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

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

一、最常用必加扩展

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

相关推荐
Black蜡笔小新1 小时前
上云网关/端口穿透/设备上云EasyNTS:无需公网IP、也不改防火墙,设备怎么从内网跑到外网去
网络·网络协议·tcp/ip
Escalating_xu2 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
默|笙3 小时前
【Linux网络】传输层协议TCP(3)滑动窗口、流量控制
linux·网络·tcp/ip
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
无言听风雨丶6 小时前
systemd 与信号 / 僵尸进程:Linux 进程管理的底层逻辑与排错
linux·服务器·网络
SDWAN_Cheap6 小时前
BGP是什么,广播IP是什么?两个容易混淆的概念拆解
网络·tcp/ip·bgp·广播ip
程序员JerrySUN6 小时前
PCIe Gen5 SSD 为什么读得快、写得慢?从存储原理到 Linux 性能实测
linux·服务器·网络
guizhoumen7 小时前
net core下WebSocket请求总是断开的解决方案
网络·websocket·网络协议
HKT_China7 小时前
香港电讯河套区创新科技中心暨AI机楼揭幕,以网络基建助力北部都会区发展
网络·ai
云边云科技_云网融合7 小时前
案例分享 | 某运动零售品牌多云治理实战:一套框架解决权限失控、网络混乱与成本黑箱
网络·零售