Apache Camel如何在路由log方法中实现带占位符的国际化多语言日志
Apache Camel多语言日志实现方案
该需求完全可以实现,Apache Camel原生log() EIP没有直接绑定国际化资源包的能力,可通过以下两种方案落地:
方案1:处理器预渲染翻译内容(灵活度最高,适配绝大多数场景)
该方案不需要修改Camel原生组件,直接在路由流程中插入翻译逻辑即可:
- 首先准备多语言资源文件,按JDK标准
ResourceBundle规则命名,比如messages_en.properties、messages_de.properties,放入类路径下 - 在路由中插入处理器完成翻译逻辑,将渲染好的日志内容存入Exchange属性,再调用
log()输出:
import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; // 资源包初始化(Spring环境可直接注入MessageSource替代) private final ResourceBundle enBundle = ResourceBundle.getBundle("messages", Locale.ENGLISH); private final ResourceBundle deBundle = ResourceBundle.getBundle("messages", Locale.GERMAN); // 路由逻辑 from("direct:yourRouteId") // 假设当前语言存在Header的`currentLocale`字段,日志参数messageId存在Header的`messageId`字段 .process(exchange -> { Locale locale = exchange.getIn().getHeader("currentLocale", Locale.class); String messageId = exchange.getIn().getHeader("messageId", String.class); // 选择对应语言的资源包 ResourceBundle usedBundle = Locale.GERMAN.equals(locale) ? deBundle : enBundle; // 翻译并填充占位符 String logContent = MessageFormat.format(usedBundle.getString("myappname.mymodule.translation"), messageId); // 存入Exchange属性避免污染业务消息体 exchange.setProperty("renderedLog", logContent); }) // 直接输出预渲染的多语言日志 .log("${exchangeProperty.renderedLog}");
如果是Spring Boot集成Camel的环境,可直接注入org.springframework.context.MessageSource调用getMessage方法完成翻译,不需要手动维护ResourceBundle实例
方案2:自定义日志组件(适合全链路统一多语言日志的场景)
如果项目全路由都需要多语言日志能力,可以扩展Camel原生Log组件,封装翻译逻辑为通用组件:
- 继承
org.apache.camel.component.log.LogEndpoint,重写日志格式化逻辑,内置支持读取翻译键、当前语言、参数三个配置项,自动完成翻译填充 - 注册自定义组件为
i18nLog,之后路由中可直接调用,无需每个路由单独写处理器:
// 注册后使用示例 from("direct:yourRouteId") .to("i18nLog:yourLoggerName?translationKey=myappname.mymodule.translation¶mHeaders=messageId&localeHeader=currentLocale");
两种方案都完全兼容你现有资源文件的{0}占位符配置,不需要修改已有的翻译内容。
内容的提问来源于stack exchange,提问作者smirnoff
相关产品推荐
相关产品推荐

