MDC logging
Available as of Camel 2.7
In Camel 2.7 we migrated to use slf4j as the logging framework in Camel. This allows us to support MDC logging.
See more details about MDC logging in the logback manual.
The log kit in use must support MDC, such as:
See the log kit documentation how to configure and use MDC.
Enabling in Camel
To enable MDC logging in Camel you can do it as follows:
Code Block |
---|
CamelContext context = ... context.setUseMDCLogging(true); ... |
In XML you enable it using the useMDCLogging
attribute as follows:
Code Block | ||||
---|---|---|---|---|
| ||||
<camelContext xmlns="http://camel.apache.org/schema/spring" useMDCLogging="true"> ... </camelContext> |
MDC information
Camel provides the following context information available for MDC:
Camel 2.9.x or older
Wiki Markup |
---|
{div:class=confluenceTableSmall} || Key || Description || | {{exchangeId}} | The exchange id | | {{messageId}} | *Camel 2.9.1:* The message id | | {{correlationId}} | The correlation id of the exchange if it's correlated. For example a sub message from the [Splitter] EIP | | {{transactionKey}} | The id of the transaction for transacted exchanges. Note the id is not unique, but its the id of the transaction template that marks the transaction boundary for the given transaction. Hence we decided to name the key {{transactionKey}} and not {{transactionID}} to point out this fact. | | {{routeId}} | The id of the route, in which the exchange is currently being routed | | {{breadcrumbId}} | *Camel 2.8:* An unique id used for tracking messages across transports. | | {{camelContextId}} | *Camel 2.8.3/2.9:* the camel context id used for tracking the message from different camel context. | {div} |
Camel 2.10 onwards
Wiki Markup |
---|
{div:class=confluenceTableSmall} || Key || Description || | {{camel.exchangeId}} | The exchange id | | {{camel.messageId}} | The message id | | {{camel.correlationId}} | The correlation id of the exchange if it's correlated. For example a sub message from the [Splitter] EIP | | {{camel.transactionKey}} | The id of the transaction for transacted exchanges. Note the id is not unique, but its the id of the transaction template that marks the transaction boundary for the given transaction. Hence we decided to name the key {{transactionKey}} and not {{transactionID}} to point out this fact. | | {{camel.routeId}} | The id of the route, in which the exchange is currently being routed | | {{camel.breadcrumbId}} | An unique id used for tracking messages across transports. | | {{camel.contextId}} | The camel context id used for tracking the message from different camel context. | {div} |
The keys are subject to change as we want to align and leverage MDC across other Apache products such as ActiveMQ, ServiceMix and Karaf.
Example using log4j
If you use log4j you can configure MDC in the log4j.properties file as shown:
Code Block |
---|
log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %-10.10X{camel.exchangeId} - %-10.10X{camel.routeId} - %m%n |
Camel will log on startup if MDC is enabled or not
Code Block |
---|
INFO SpringCamelContext - - - MDC logging is enabled on CamelContext: camel-1 |
The follow snippet is from an unit test which shows MDC in use. Notice the exchange id and route id is displayed in their respective columns in the log file:
Code Block |
---|
INFO SpringCamelContext - - - Apache Camel (CamelContext: camel-1) started in 1.228 seconds INFO foo - 358739-0-2 - route-a - Exchange[ExchangePattern:InOnly, BodyType:String, Body:Hello World] INFO bar - 358739-0-2 - route-b - Exchange[ExchangePattern:InOnly, BodyType:String, Body:Hello World] INFO MockEndpoint - - - Asserting: Endpoint[mock://result] is satisfied |
Using breadcrumb
Available as of Camel 2.8
The breadcrumbId
key for MDC logging is only available if useBreadcrumb
option has been enabled on CamelContext (its default enabled). When enabled Camel will enrich the Camel Message by adding a header to it with the key breadcrumbId
containing the id. Camel will use the messageId if no existing breadcrumbId was found in the message. By storing the breadcrumb as a header allow us to transport the breadcrumb across transports which supports message body and headers. For example HTTP and JMS and many other transports does that.
If you want to disable breadcrumb you do as follows in Java
Code Block |
---|
CamelContext context = ... context.setUseBreadcrumb(false); ... |
And in XML DSL
Code Block | ||||
---|---|---|---|---|
| ||||
<camelContext xmlns="http://camel.apache.org/schema/spring" useBreadcrumb="false"> ... </camelContext> |