# 基于现有日志系统的功能扩展方案(直接可落地、可写代码)
我按常用扩展方向讲,每个给思路 + 可直接加的代码片段,适配你上面那套单例日志框架。
一、最常用必加扩展
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
三、架构扩展(工程化)
- 支持多输出目标:控制台 + 文件 + 网络(远程日志服务器)
- 配置文件驱动:读取 log_config.json 控制级别、路径、分割策略
- 支持 JSON 格式日志,方便 ELK 收集
- DLL 封装,其他模块直接调用
四、我可以直接帮你升级完整版本
你告诉我想要哪些,我一次性给你完整可编译的增强版代码:
- 等级过滤
- 按日期切日志
- 模块标签
- 异步日志
- 控制台开关
- 自动清理旧日志
直接选序号,我给你写成品代码。(直接可落地、可写代码)
一、最常用必加扩展
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
三、架构扩展(工程化)
- 支持多输出目标:控制台 + 文件 + 网络(远程日志服务器)
- 配置文件驱动:读取 log_config.json 控制级别、路径、分割策略
- 支持 JSON 格式日志,方便 ELK 收集
- DLL 封装,其他模块直接调用