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

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

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

一、最常用必加扩展

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

相关推荐
哼?~9 小时前
多路复用I/O之Epoll
网络
开开心心就好10 小时前
免费无广告的批量卸载与系统清理工具
linux·服务器·网络·智能手机·rabbitmq·excel·memcached
wanhengidc10 小时前
高防服务器中的数据安全
运维·服务器·网络
艾莉丝努力练剑10 小时前
【Linux网络】Linux 网络编程:HTTP(五)HTTP收尾,从Cookie会话保持、抓包问题到 HTTPS 初识
linux·运维·服务器·网络·c++
时夜_Ryan10 小时前
JumpServer堡垒机:一键部署运维安全审计
linux·运维·服务器·网络·安全·centos
车软派开发学长10 小时前
零基础学习车软嵌入式AUTOSAR,以一帧CAN报文实战讲解AUTOSAR的学习
网络·stm32·车载系统·autosar·嵌入式实时数据库
源远流长jerry10 小时前
LVS 与 Nginx 负载均衡:从原理到生产实战
运维·网络·网络协议·tcp/ip·nginx·负载均衡·lvs
yyuuuzz10 小时前
境外云服务器使用常见问题梳理
运维·服务器·网络·aws
暗夜猎手-大魔王11 小时前
转载--Hermes Agent 02 | 模型无关的秘密:200+ 模型的统一接入层
网络