首页 > 解决方案 > 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

标签: spring-bootloggingapache-camellog4j2

解决方案


根据文档,日志eip以路由名作为日志名,见camel.apache.org/components/latest/eips/log-eip.html。要使用 java dsl 设置名称,您可以使用类似.log(LoggingLevel.DEBUG, "my-name", "${body}")


推荐阅读