登入 Apache Camel
1. 概述
日誌記錄在軟體開發中至關重要,因為它有助於記錄應用程式的每個足跡。它有助於追蹤應用程式的活動和狀態。本質上,它對於調試目的很有用。
Apache Camel 提供了一個元件、介面和攔截器來記錄訊息和交換。它透過在各種日誌框架上提供抽象層來簡化日誌記錄。
在本教程中,我們將了解在 Camel 應用程式中記錄訊息和交換的四種方法。
2. 使用日誌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
,將檔案從inbox
傳輸到outbox
資料夾。首先,我們定義傳入檔案的位置。接下來,我們使用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 。
3. 使用Processor
介面
Processor
是 Apache Camel 中的一個重要接口,它允許存取交換以進行進一步的操作。它使我們能夠靈活地更改交換主體。但是,我們也可以使用它來輸出人類可讀的日誌訊息。
首先, Processor
不是日誌記錄工具。因此,我們需要建立一個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 cbaFileCopierCamelRoute - We are passing the message to a FileProcesor to Capitalize the message body
從上面的輸出來看,自訂日誌訊息被輸出到控制台。
4. 使用日誌組件
Apache Camel 提供了一個 Log 元件,可以協助將 Camel Message
記錄到控制台輸出。要使用 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 個。
5. 使用Tracer
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
則適合偵錯中使用的更複雜的日誌。
與往常一樣,範例的原始程式碼可在 GitHub 上取得。