You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

方案可行性说明

  1. 无侵入兼容:原有数千处LOG/LOG_ERR等宏调用完全无需修改,因为每个项目的宏仍绑定到自身的log_inst静态实例。
  2. 消除重复代码:枚举、Logger模板类仅维护一份,后续修改只需在公共头文件操作,避免两个项目同步修改的麻烦。
  3. 实例独立性:static修饰的log_inst是文件作用域的,两个项目的实例完全独立,日志路径各自保留原有逻辑。

内容的提问来源于stack exchange,提问作者ShIvA SaI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:25:15