Apache Camel日誌四種方法

banq發表於2024-04-11

日誌記錄在軟體開發中至關重要,因為它有助於記錄應用程式的每個足跡。它有助於跟蹤應用程式的活動和狀態。本質上,它對於除錯目的很有用。

Apache Camel提供了一個元件、介面和攔截器來記錄訊息和交換。它透過在各種日誌框架上提供抽象層來簡化日誌記錄。

在本教程中,我們將瞭解在 Camel 應用程式中記錄訊息和交換的四種方法。

1、使用日誌EIP
Apache Camel 2.2 提供了一個輕量級的log() DSL 來記錄來自路由的人類可讀訊息。它的主要用例是快速向日志控制檯輸出訊息。此外,我們可以將它與 Camel Simple 表示式語言一起使用,以進一步記錄從路由到日誌控制檯的詳細資訊。

讓我們看一個將檔案從一個資料夾複製到另一個資料夾的示例:

class FileCopierCamelRoute extends RouteBuilder {
    void configure() {
        from(<font>"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:<font>//data/inbox] INFO  route1 - We got an incoming file welcome.txt containing: Welcome to Baeldung<i>
14:39:23.423 [Camel (camel-1) thread #1 - file:
//data/inbox] INFO  route1 - Successlly transfer file: welcome.txt<i>

與 Log 元件和Tracer攔截器相比, log () DSL 是輕量級的。

此外,我們可以顯式指定日誌級別和名稱:

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

在這裡,我們在傳遞日誌訊息之前指示日誌級別和名稱。我們還有 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(<font>"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:<font>//data/inbox] INFO  c.b.a.FileCopierCamelRoute - We are passing the message to a FileProcesor to Capitalize the message body<i>

從上面的輸出來看,自定義日誌訊息被輸出到控制檯。

3、使用日誌元件
Apache Camel 提供了一個 Log 元件,可以幫助將 Camel訊息記錄到控制檯輸出。要使用 Log 元件,我們可以將訊息路由到它:

void configure() {
    from(<font>"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:<font>//data/inbox] INFO  com.baeldung.apachecamellogging - Exchange[ExchangePattern: InOnly, BodyType: org.apache.camel.component.file.GenericFile, Body: [Body is file based: GenericFile[welcome.txt]]]<i>
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]<i>

此外,我們可以透過新增showBodyType和maxChars選項來減少輸出的冗長:

.to(<font>"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(<font>"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攔截器的日誌:

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

在上面的輸出中,Tracer記錄了從生產者到消費者發生的每個過程和交換。這對於除錯很有用。

值得注意的是,日誌輸出很詳細,但為了簡單起見,我們顯示了基本的日誌訊息。

結論
在本文中,我們學習了四種登入 Apache Camel 的方法。此外,我們還看到了使用log() DSL、Tracer、Processor和 Log 元件將訊息記錄到控制檯的示例。 log () DSL 和Processor介面非常適合人類可讀的日誌,而 Log 元件和Tracer則適合除錯中使用的更復雜的日誌。
 

相關文章