现有应用程序使用 Camel 日志记录(“log()”DSL,以及 Log 组件。
我们希望拦截或覆盖,以便每个日志消息也记录出特定的标头值(例如 x-correlation-id=ABC-123)
实现这一目标的良好、惯用的方法是什么?
Apache Camel 从 LogListener
版本开始支持可插拔
2.19.0
。这是非常强大的,因为它的方法 onLog
在记录之前调用,具有 Exchange
、CamelLogger
和消息的实例。您可以在那里自定义消息,几乎没有任何限制。
LogListener的实现:
public class MyLogListener implements LogListener {
@Override
public String onLog(Exchange exchange, CamelLogger camelLogger, String message) {
return String.format("%s: %s", exchange.getIn().getHeader(Exchange.CORRELATION_ID), message);
}
}
LogListener注册:
getContext().addLogListener(new MyLogListener());
如果您使用的是 Apache Camel 版本
2.21.0
及更新版本,则无需将其注册到上下文,因为它是在注册表中查找的,因此将 MyLogListener
注释为 @Bean
就足够了。
用@Bean注释到底是什么意思?你能写出示例代码吗?