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

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

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

一、最常用必加扩展

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

相关推荐
碎碎念_4921 小时前
以太网技术、VLAN、STP详解
网络·stp·vlan
hbugs0011 小时前
【案例分享】全网首个华三数据中心流量可视化实验,基于EVE-NG V7平台
网络·网络协议·安全·devops·eve-ng
不会C语言的男孩2 小时前
第 13 章 网络与分布式系统基础
网络
山东穆柯传感器3 小时前
安全触边损坏如何维修及更换配件
网络·安全
huainingning3 小时前
华三ACL单向TCP互通组网-通过Established状态回包实现
运维·网络·tcp/ip
Johnstons3 小时前
游戏网络测试怎么做?从延迟到丢包,一套完整的游戏弱网测试方案
网络·游戏·php
Rocket-Luo3 小时前
谈谈企业中的网络安全
网络·安全·web安全
byte_conn3 小时前
船舶机舱监控频频瘫痪?CAN转光纤与中继器重塑海事通信底座
网络
技术不好的崎鸣同学4 小时前
[BJDCTF2020]The mystery of ip 思路及解法
网络·安全·web安全
normanhere5 小时前
浪潮云国产化超融合规划和部署案例
服务器·网络