Logging 在Apache驼峰路由中使用动态日志名
我使用的是Camel和Log4J,在我的路由中,我使用的是这样的日志消息Logging 在Apache驼峰路由中使用动态日志名,logging,apache-camel,log4j,Logging,Apache Camel,Log4j,我使用的是Camel和Log4J,在我的路由中,我使用的是这样的日志消息 <log message="This is a test" loggingLevel="TRACE" logName="com.acme.logfile1"/> 我的目标是,根据某些标准,将消息记录到我在log4j.properties中定义的不同记录器 如果我用不同的日志名进行硬编码,我的消息将被发送到相应的文件中 转到日志文件1 转到日志文件2 我想使用一个名为“logfile”的头文件值来确定要写入
<log message="This is a test" loggingLevel="TRACE" logName="com.acme.logfile1"/>
我的目标是,根据某些标准,将消息记录到我在log4j.properties中定义的不同记录器
如果我用不同的日志名进行硬编码,我的消息将被发送到相应的文件中
转到日志文件1
转到日志文件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)
我在日志文件1中看到“这是对com.acme.foobar的测试”
那么-是否有一种方法可以动态地将日志定向到我的路由中的不同记录器?否在驼峰路由中不使用
。这是静态的。您可以使用
或
在Java代码中,您可以编写一些动态记录的Java代码。这是我的处理器,我用于动态记录器。请随意使用它。此processoor用于将简单语言转换为字符串和日志消息。日志名的后缀由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));
}
}
用法
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");