Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 在Apache驼峰路由中使用动态日志名_Logging_Apache Camel_Log4j - Fatal编程技术网

Logging 在Apache驼峰路由中使用动态日志名

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”的头文件值来确定要写入

我使用的是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 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");