如何访问并修改log4cxx配置文件中定义的RollingFileAppender对象
log4cxx代码中获取并修改配置定义的RollingFileAppender解决方案
错误原因
- 你代码中直接使用的
rfa是XML配置里定义的appender名称,不是C++代码中声明的变量,编译器无法直接识别 log4cxx::Appender.rfs->xxx的写法存在语法错误:Appender是类名不是实例,同时混用了成员访问符.和指针访问符->,不符合C++语法规范
正确实现步骤
第一步:从已加载的日志配置中获取Appender实例
你需要先获取绑定了该appender的Logger实例(通常是root logger),通过配置中定义的appender名称rfa获取实例后,再转换为RollingFileAppender类型的智能指针。
第二步:修正原有代码的语法问题
log4cxx的核心对象基本都通过智能指针管理,过滤器也需要用指针形式添加,字符串参数要适配log4cxx的字符编码规则。
完整示例代码
void LogImplemetation::addFilter() { // 1. 获取绑定了目标appender的Logger,此处以root Logger为例,若绑定自定义logger替换为对应名称即可 LoggerPtr rootLogger = Logger::getRootLogger(); // 2. 通过配置中的appender名称获取实例,做类型转换 AppenderPtr appender = rootLogger->getAppender(LOG4CXX_STR("rfa")); RollingFileAppenderPtr rfa = log4cxx::cast<RollingFileAppender>(appender); // 非空判断,避免配置未加载/名称不匹配导致空指针崩溃 if (!rfa) { // 可自行添加错误提示逻辑 return; } // 3. 构建自定义触发策略 FilterBasedTriggeringPolicyPtr fbtp = FilterBasedTriggeringPolicyPtr(new FilterBasedTriggeringPolicy()); // 过滤器使用智能指针形式 log4cxx::filter::StringMatchFilterPtr tf = log4cxx::filter::StringMatchFilterPtr(new log4cxx::filter::StringMatchFilter()); tf->setStringToMatch(LOG4CXX_STR("filterText")); tf->setAcceptOnMatch(true); fbtp->addFilter(tf); /* 可选:如果需要保留原有配置的大小触发规则,可组合原有触发策略实现多规则同时生效 TriggeringPolicyPtr oldSizePolicy = rfa->getTriggeringPolicy(); // 把原有大小触发规则也加入新的复合触发策略即可 */ Pool p; fbtp->activateOptions(p); // 替换appender的触发策略 rfa->setTriggeringPolicy(fbtp); // 重新激活appender配置使修改生效 rfa->activateOptions(p); }
注意事项
- 执行这段代码前必须确保log4cxx配置文件已经完成加载,否则会获取不到appender实例
- 所有传入log4cxx接口的字符串参数需要用
LOG4CXX_STR宏包裹,适配不同编译环境下的字符编码设置 - 编译时需要正确配置log4cxx的头文件路径,链接对应版本的log4cxx库文件
内容的提问来源于stack exchange,提问作者Rob_BG
相关产品推荐
相关产品推荐

