spring-boot - Camel 3.5 记录器、Spring Boot 和 log4j2
问题描述
我正在使用 Camel 3.5 和 Spring Boot 2.3.4 应用程序。我正在尝试在 log4j2.xml 文件中使用 log4j2 和配置日志级别和附加程序。它在处理器中工作,但不能直接在 RouteDefinition 中工作。
package org.example.builders;
import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
import org.example.processors.Watch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class Builder extends RouteBuilder {
private final static Logger LOGGER = LoggerFactory.getLogger(Builder.class.getName());
@Override
public void configure() {
from("{{uri.quartz.debug}}")
// OK
.log(LoggingLevel.DEBUG, LOGGER,"${header.fireTime} - Quartz DEBUG 1")
// NOK
.log(LoggingLevel.DEBUG, "${header.fireTime} - Quartz DEBUG 2")
.log(LoggingLevel.INFO, "${header.fireTime} - Quartz INFO")
.log(LoggingLevel.TRACE, "${header.fireTime} - Quartz TRACE")
.log(LoggingLevel.WARN, "${header.fireTime} - Quartz WARN")
.log(LoggingLevel.ERROR, "${header.fireTime} - Quartz ERROR")
.process(new Watch())
.to("mock:end");
}
}
处理器类:
package org.example.processors;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Watch implements Processor {
private final static Logger LOGGER = LogManager.getLogger(Watch.class.getName());
@Override
public void process(Exchange exchange) throws Exception {
Object body = exchange.getIn().getBody();
LOGGER.log(Level.ALL, "LOGGER -> ALL");
LOGGER.log(Level.TRACE, "LOGGER -> TRACE");
LOGGER.log(Level.DEBUG, "LOGGER -> DEBUG");
LOGGER.log(Level.INFO, "LOGGER -> INFO");
LOGGER.log(Level.WARN, "LOGGER -> WARN");
LOGGER.log(Level.ERROR, "LOGGER -> ERROR");
exchange.getMessage().setBody(body);
}
}
他是log4j2.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT"/>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
<Logger name="org.example.processors" level="trace"></Logger>
<Logger name="org.example.builders" level="debug"></Logger>
</Loggers>
</Configuration>
这是控制台输出。仅打印错误日志级别。我必须调用方法 .log(LoggingLevel.DEBUG, LOGGER, 才能得到我想要的。
Tue Nov 17 18:28:10 CET 2020 - Quartz DEBUG 1
Tue Nov 17 18:28:10 CET 2020 - Quartz ERROR
LOGGER -> TRACE
LOGGER -> DEBUG
LOGGER -> INFO
LOGGER -> WARN
LOGGER -> ERROR
编辑
感谢 Luca Burgazzoli
在 log4j2.xml
<Logger name="logging-route" level="debug"></Logger>
在 dsl 中:
.log(LoggingLevel.DEBUG, "logging-route", "${header.fireTime} - Quartz DEBUG 2")
控制台输出:
Tue Nov 17 19:43:25 CET 2020 - Quartz DEBUG 1
Tue Nov 17 19:43:25 CET 2020 - Quartz DEBUG 2
Tue Nov 17 19:43:25 CET 2020 - Quartz ERROR
LOGGER -> TRACE
解决方案
根据文档,日志eip以路由名作为日志名,见camel.apache.org/components/latest/eips/log-eip.html。要使用 java dsl 设置名称,您可以使用类似.log(LoggingLevel.DEBUG, "my-name", "${body}")