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

Camel 3.x版本LogListener注册失败问题求助

Camel 3.19.0 迁移后 LogListener 失效的解决思路

问题背景

此前使用Camel LogListener 拦截Log EIP的所有日志消息,通过自定义Header和Exchange属性处理这些消息。从v2.23.x迁移到v3.19.0版本后,LogListener 停止工作。

迁移前实现方式

注册监听器的代码:

log.info("Registering log listener");
getContext().addLogListener(new CustomLogListener());

CustomLogListener 实现代码:

public class CustomLogListener implements LogListener {

    @Override
    public String onLog(final Exchange exchange, final CamelLogger camelLogger, final String message) {
        return String.format("traceId=%s TXN=%s TENANT=%s %s",
            exchange.getProperty(TOP_TRACEID, String.class),
            exchange.getProperty(TRANSACTION_ID, String.class), 
            exchange.getProperty(TOPUP_ENV_HEADER, String.class), 
            message);
    }
}

迁移后的无效尝试

升级后context.addLogListener(...)方法被移除,尝试将监听器绑定到注册表,但无效果:

TopLogListener logListener = new TopLogListener(); 
getContext().getRegistry().bind("logListener", logListener);

补充说明:应用基于Jakarta JEE开发,打包为war包部署在WildFly,未使用Spring Boot。


解决思路

Camel 3.x对LogListener的注册机制做了重构,原CamelContext.addLogListener()方法已被移除,以下是可行的解决方式:

1. 通过ManagementStrategy注册监听器

这是Camel 3.x官方推荐的注册方式,LogListener需通过ManagementStrategy添加:

log.info("Registering log listener");
CustomLogListener logListener = new CustomLogListener();
getContext().getManagementStrategy().addLogListener(logListener);

ManagementStrategy是Camel负责管理各类监听器的核心组件,通过它注册的日志监听器会被Log EIP正确识别并触发。

2. 排查生效问题

如果上述方式仍未生效,可检查以下几点:

  • 确认CamelContext使用的是默认的DefaultManagementStrategy,WildFly部署下默认启用该策略,若自定义了ManagementStrategy需确保监听器注册逻辑未被覆盖。
  • 开启Camel管理模块的调试日志(日志类别org.apache.camel.management.ManagementStrategy),查看监听器是否被成功注册。
  • 检查是否有自定义LogFormatter或其他日志相关配置干扰了监听器的执行顺序。

3. 替代方案:自定义LogFormatter

若监听器方式仍存在适配问题,可改用自定义LogFormatter实现日志增强,这在Camel 3.x中是更灵活的日志处理方案:

public class CustomLogFormatter extends DefaultLogFormatter {
    @Override
    public String format(Exchange exchange, CamelLogger camelLogger, String message) {
        String traceId = exchange.getProperty(TOP_TRACEID, String.class);
        String txnId = exchange.getProperty(TRANSACTION_ID, String.class);
        String tenant = exchange.getProperty(TOPUP_ENV_HEADER, String.class);
        return String.format("traceId=%s TXN=%s TENANT=%s %s", traceId, txnId, tenant, message);
    }
}

将自定义Formatter注册到LogComponent:

LogComponent logComponent = getContext().getComponent("log", LogComponent.class);
logComponent.setLogFormatter(new CustomLogFormatter());

这种方式直接替换日志的格式化逻辑,效果与监听器一致,且兼容性更强。


内容的提问来源于stack exchange,提问作者Hari K Murthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:42:26