我正在使用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的测试”那么 - 有没有办法动态地将日志引导到路线中的不同记录器?
答案 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");