代码之家  ›  专栏  ›  技术社区  ›  a344254

在Apache Camel路由中使用动态日志名

  •  2
  • a344254  · 技术社区  · 7 年前

    我使用的是Camel和Log4J,在我的路由中,我使用的是这样的日志消息

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

    我的目标是,根据特定的标准,将消息记录到我在log4j中定义的不同记录器。属性。

    如果我用不同的日志名硬编码,我的消息会转到相应的文件

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

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

    我想使用一个名为“logfile”的头值来确定要写入哪个日志文件,并尝试了这个方法,但它似乎不起作用

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

    我知道我的头设置正确,就好像我这样做了一样,我在日志文件1中看到了适当的值(假设${in.headers.logfile}=foobar)

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

    我在日志文件1中看到“这是对com.acme.foobar的测试”

    那么,有没有一种方法可以动态地将日志定向到我路由中的不同记录器?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Claus Ibsen    7 年前

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

        2
  •  0
  •   Bedla    7 年前

    这是我的处理器,我用于动态记录器。请随意使用它。此进程使用 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");