C++项目重复logger类合并咨询:不修改#define且保留静态对象
重构方案:合并重复Logger类且保留项目独立静态实例
核心思路
将两个项目中完全重复的代码(枚举、Logger模板类)抽离到公共头文件维护,仅保留每个项目独有的日志实例配置(路径、宏绑定),这样既消除重复代码,又完全兼容原有数千处LOG/LOG_ERR等宏调用。
步骤1:提取公共代码到公共头文件
创建common_logger.h,存放两个项目共用的枚举、Logger模板类及依赖的file_log_policy(如果该类也是重复实现的话):
// common_logger.h enum severity_type { debug = 1, error, warning }; // 假设file_log_policy是两个项目共用的,也放到公共头文件 class file_log_policy { // 原有file_log_policy的实现内容 }; template< typename T > class logger { public: logger(const std::string& name); // 补充print成员函数的声明(原代码未写出,需匹配原有实现) template<severity_type S> void print(const char* format, ...); }; // 如果Logger模板类的实现是头文件内联的,直接在这里补充;若是cpp实现,统一放到common_logger.cpp
步骤2:保留项目独立的日志实例与宏配置
每个项目仅保留自身独有的静态实例和宏绑定逻辑,替换原有重复代码。
项目1的日志头文件(如project1_logger.h)
#include "common_logger.h" #define LOGGING_LEVEL_1 static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log"); #ifdef LOGGING_LEVEL_1 #define LOG log_inst.print< severity_type::debug > #define LOG_ERR log_inst.print< severity_type::error > #define LOG_WARN log_inst.print< severity_type::warning > #else #define LOG(...) #define LOG_ERR(...) #define LOG_WARN(...) #endif #ifdef LOGGING_LEVEL_2 #define ELOG log_inst.print< severity_type::debug > #define ELOG_ERR log_inst.print< severity_type::error > #define ELOG_WARN log_inst.print< severity_type::warning > #else #define ELOG(...) #define ELOG_ERR(...) #define ELOG_WARN(...) #endif
项目2的日志头文件(如project2_logger.h)
#include "common_logger.h" #define LOGGING_LEVEL_1 static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\restore.log"); #ifdef LOGGING_LEVEL_1 #define LOG log_inst.print< severity_type::debug > #define LOG_ERR log_inst.print< severity_type::error > #define LOG_WARN log_inst.print< severity_type::warning > #else #define LOG(...) #define LOG_ERR(...) #define LOG_WARN(...) #endif #ifdef LOGGING_LEVEL_2 #define ELOG log_inst.print< severity_type::debug > #define ELOG_ERR log_inst.print< severity_type::error > #define ELOG_WARN log_inst.print< severity_type::warning > #else #define ELOG(...) #define ELOG_ERR(...) #define ELOG_WARN(...) #endif
方案可行性说明
- 无侵入兼容:原有数千处
LOG/LOG_ERR等宏调用完全无需修改,因为每个项目的宏仍绑定到自身的log_inst静态实例。 - 消除重复代码:枚举、Logger模板类仅维护一份,后续修改只需在公共头文件操作,避免两个项目同步修改的麻烦。
- 实例独立性:
static修饰的log_inst是文件作用域的,两个项目的实例完全独立,日志路径各自保留原有逻辑。
内容的提问来源于stack exchange,提问作者ShIvA SaI
相关产品推荐
相关产品推荐

