在Apache Camel路由中使用动态logName

时间:2018-04-09 19:23:32

标签: logging apache-camel log4j

我正在使用Camel和Log4J,在我的路线中我正在使用像这样的日志消息

<log message="This is a test" loggingLevel="TRACE" logName="com.acme.logfile1"/>

我的目标是,根据某些标准,将消息记录到我在log4j.properties中定义的不同记录器。

如果我在不同的logNames中硬编码,我的消息将转到相应的文件

<log message="This is a test" loggingLevel="TRACE" logName="com.acme.logfile1"/>转到logfile 1

<log message="This is a test" loggingLevel="TRACE" logName="com.acme.logfile2"/>转到logfile 2

我想使用名为“logfile”的标头值来确定要写入哪个日志文件并尝试过这个,但它似乎无法正常工作

<log message="This is a test for com.acme.${in.headers.logfile}" loggingLevel="TRACE" logName="com.acme.${in.headers.logfile}"/>

我知道我的标题设置正确就像我这样做了我在logfile1中看到了相应的值(假设$ {in.headers.logfile} = foobar)

<log message="This is a test for com.acme.${in.headers.logfile}" loggingLevel="TRACE" logName="com.acme.logfile1"/>

我在logfile1

中看到“这是对com.acme.foobar的测试”

那么 - 有没有办法动态地将日志引导到路线中的不同记录器?

2 个答案:

答案 0 :(得分:1)

否则不使用Camel路线中的<log>。那是静态的。您可以使用<bean><processor>,在Java代码中,您可以编写一些动态记录的Java代码。

答案 1 :(得分:0)

这是我的处理器,我用于动态记录器。随意使用它。此进程使用Expression将简单语言转换为字符串,并将CamelLogger转换为日志消息。 logName的后缀由logger标题确定;

public class CustomLogger implements Processor {
    private static final String LOGGER_PREFIX = "com.acme";

    final String simple;
    final LoggingLevel level;

    public CustomLogger(String simple, LoggingLevel level) {
        this.simple = simple;
        this.level = level;
    }

    @Override
    public void process(Exchange exchange) throws Exception {
        Expression expression = exchange.getContext().resolveLanguage("simple").createExpression(simple);
        new CamelLogger(
                String.format("%s.%s", LOGGER_PREFIX, exchange.getIn().getHeader("logger", "default")),
                level
        ).log(expression.evaluate(exchange, String.class));
    }
}

用法

from("direct:someRoute")
    .process(new CustomLogger("This should go to ${in.headers.logger} logger", LoggingLevel.INFO))
    .to("log:done");