Apache Camel日志四种方法

日志记录在软件开发中至关重要,因为它有助于记录应用程序的每个足迹。它有助于跟踪应用程序的活动和状态。本质上,它对于调试目的很有用。

Apache Camel提供了一个组件、接口和拦截器来记录消息和交换。它通过在各种日志框架上提供抽象层来简化日志记录。

在本教程中,我们将了解在 Camel 应用程序中记录消息和交换的四种方法。

1、使用日志EIP
Apache Camel 2.2 提供了一个轻量级的log() DSL 来记录来自路由的人类可读消息。它的主要用例是快速向日志控制台输出消息。此外,我们可以将它与 Camel Simple 表达式语言一起使用,以进一步记录从路由到日志控制台的详细信息。

让我们看一个将文件从一个文件夹复制到另一个文件夹的示例:

class FileCopierCamelRoute extends RouteBuilder {
    void configure() {
        from("file:data/inbox?noop=true")
          .log(
"We got an incoming file ${file:name} containing: ${body}")
          .to(
"file:data/outbox")
          .log(
"Successfully transfer file: ${file:name}");
    }
}

在上面的代码中,我们配置了一个RouteBuilder,将文件从收件箱传输到发件箱文件夹。首先,我们定义传入文件的位置。接下来,我们使用log()  DSL 在传入文件及其内容上输出人类可读的日志。此外,我们使用简单表达式语言来获取文件名和文件内容作为日志消息的一部分。

这是日志输出:

14:39:23.389 [Camel (camel-1) thread #1 - file://data/inbox] INFO  route1 - We got an incoming file welcome.txt containing: Welcome to Baeldung
14:39:23.423 [Camel (camel-1) thread #1 - file:
//data/inbox] INFO  route1 - Successlly transfer file: welcome.txt

与 Log 组件和Tracer拦截器相比, log () DSL 是轻量级的。

此外,我们可以显式指定日志级别和名称:

// ...
.log(LoggingLevel.DEBUG,
"Output Process","The Process ${id}")
// ...

在这里,我们在传递日志消息之前指示日志级别和名称。我们还有 WARN、TRACE 和 OFF 选项作为日志级别。当未指定调试级别时,log() DSL 使用 INFO。

2、使用处理器接口
处理器Processor是 Apache Camel 中的一个重要接口, 它允许访问交换以进行进一步的操作。它使我们能够灵活地更改交换主体。但是,我们也可以使用它来输出人类可读的日志消息。

首先,处理器不是日志记录工具。因此,我们需要创建一个Logger实例来使用它。 Apache Camel默认使用SLF4J库。让我们创建一个Logger实例:

private static final Logger LOGGER = LoggerFactory.getLogger(FileCopierCamelRoute.class);

接下来,让我们看一个将消息传递给 bean 进行进一步操作的示例:

void configure() {
    from("file:data/inbox?noop=true")
     .to(
"log:com.baeldung.apachecamellogging?level=INFO")
     .process(process -> {
         LOGGER.info(
"We are passing the message to a FileProcesor bean to capitalize the message body");
     })
     .bean(FileProcessor.class)
     .to(
"file:data/outbox")
}

在这里,我们将传入消息传递给FileProcessor bean,以将文件内容转换为大写。然而,我们在将消息传递给 bean 进行处理之前,通过创建Processor的实例来记录一条信息。

最后我们看一下日志输出:

14:50:47.048 [Camel (camel-1) thread #1 - file://data/inbox] INFO  c.b.a.FileCopierCamelRoute - We are passing the message to a FileProcesor to Capitalize the message body

从上面的输出来看,自定义日志消息被输出到控制台。

3、使用日志组件
Apache Camel 提供了一个 Log 组件,可以帮助将 Camel消息记录到控制台输出。要使用 Log 组件,我们可以将消息路由到它:

void configure() {
    from("file:data/inbox?noop=true")
      .to(
"log:com.baeldung.apachecamellogging?level=INFO")
      .bean(FileProcessor.class)
      .to(
"file:data/outbox")
      .to(
"log:com.baeldung.apachecamellogging")
}

在这里,我们在两个地方使用 Log 组件。首先,我们使用level选项在 INFO 日志级别记录消息正文。此外,我们在操作文件后记录消息正文,但没有指定日志记录级别。

值得注意的是,在未指定日志记录级别的情况下,Log 组件默认使用 INFO 级别。

这是日志输出:

09:36:32.432 [Camel (camel-1) thread #1 - file://data/inbox] INFO  com.baeldung.apachecamellogging - Exchange[ExchangePattern: InOnly, BodyType: org.apache.camel.component.file.GenericFile, Body: [Body is file based: GenericFile[welcome.txt]]]
09:36:32.454 [Camel (camel-1) thread #1 - file:
//data/inbox] INFO  com.baeldung.apachecamellogging - Exchange[ExchangePattern: InOnly, BodyType: String, Body: WELCOME TO BAELDUNG]

此外,我们可以通过添加showBodyType和maxChars选项来减少输出的冗长:

.to("log:com.baeldung.apachecamellogging?showBodyType=false&maxChars=20")

在上面的代码中,我们忽略消息正文时间并将正文字符精简为 20 个。

4、使用追踪器
Tracer是 Apache Camel 架构的一部分,有助于记录运行时消息的路由方式。它在路由过程中跟踪交换快照。它可以拦截从一个节点到另一节点的消息移动。

要使用Tracer,我们必须在路由配置方法中启用它:

getContext().setTracing(true);

这使得Tracer拦截器能够拦截所有交换进程并将其记录到日志控制台。

让我们看一个示例代码,它使Tracer能够跟踪交换过程:

void configure() {
    getContext().setTracing(true);
    from("file:data/json?noop=true")
      .unmarshal().json(JsonLibrary.Jackson)
      .bean(FileProcessor.class,
"transform")
      .marshal().json(JsonLibrary.Jackson)
      .to(
"file:data/output");
}

在上面的代码中,我们从源复制一个JSON文件并将其转换为 Camel 可以操作的数据结构。我们将内容传递给 bean 来更改文件内容。接下来,我们将消息转换为 JSON 并将其发送到预定目的地。

这是来自Tracer拦截器的日志:

// ...
09:23:10.767 [Camel (camel-1) thread #1 - file:
//data/json] INFO  FileCopierTracerCamelRoute:14 - *--> [route1      ] [from[file:data/json?noop=true]   ]
09:23:10.768 [Camel (camel-1) thread #1 - file:
//data/json] INFO  FileCopierTracerCamelRoute:14 -      [route1      ] [log:input?level=INFO             ]
// ...

在上面的输出中,Tracer记录了从生产者到消费者发生的每个过程和交换。这对于调试很有用。

值得注意的是,日志输出很详细,但为了简单起见,我们显示了基本的日志消息。

结论
在本文中,我们学习了四种登录 Apache Camel 的方法。此外,我们还看到了使用log() DSL、Tracer、Processor和 Log 组件将消息记录到控制台的示例。 log () DSL 和Processor接口非常适合人类可读的日志,而 Log 组件和Tracer则适合调试中使用的更复杂的日志。