Tracer
Tracer is the sister to Camel's Debugger. They are much alike.
Camel supports a tracer interceptor that is used for logging the route executions at INFO level.
The Tracer is an InterceptStrategy which can be applied to a DefaultCamelContext or SpringCamelContext to ensure that there is a TracerInterceptor created for every node in the DSL.
You can enable or disable the Tracer's logging dynamically, by calling the tracer's setEnable method.
Formatting
The tracer formats the execution of exchanges to log lines. They are logged at INFO level in the log category: org.apache.camel.processor.interceptor.TraceInterceptor
.
The tracer uses by default TraceFormatter
to format the log line.
TraceFormatter has the following options
Option |
Default |
Description |
---|---|---|
showBreadCrumb |
true |
Outputs the unique unit of work for the exchange. To be used for correlation so you can identify the same exchange. |
showNode |
true |
The destination node. |
showExchangeId |
false |
To output the unique exchange id. Currently the breadcrumb is sufficient. |
showProperties |
true |
Output the exchange properties |
showHeaders |
true |
Output the in message headers |
showBodyType |
true |
Output the in body Java type |
showBody |
true |
Output the in body |
Example:
ID-claus-acer/3690-1214458315718/2-0 -> node3 To[mock:a] InOnly Properties:{CamelCauseException=null} Headers:{to=James} Body:Hello London
ID-claus-acer/3690-1214458315718/2-0
is the breadcrumb with the unique correlation id.
node3
is the id of the node in the route path. Is always shown.
To[mock:a]
is the destination node.
InOnly
is the exchange pattern. Is always shown.
Then the rest is properties, headers and the body.
Enabling
To enable tracer from the main run
java org.apache.camel.spring.Main -t
or
java org.apache.camel.spring.Main -trace
and the tracer will be active.
Enabling from Java DSL
The tracer can be enabled by adding it to the interceptor chain to the camel context. This is demonstrated in the unit test below.
Notice: We could have changed the properties on the Tracer object before adding it, if we e.g. don't like the default settings.
Running the test we get the trace information logged at INFO level:
2008-06-26 07:31:55,828 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-0 -> node5 Interceptor[Delegate(Pipeline[DeadLetterChannel[Delegate(TraceInterceptor[Processor[MyProcessor]]), ... 2008-06-26 07:31:55,843 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-0 -> node2 Processor[MyProcessor] InOnly Properties:{CamelCauseException=null} Headers:{to=James} Body:Hello London 2008-06-26 07:31:55,843 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-0 -> node3 To[mock:a] InOnly Properties:{CamelCauseException=null} Headers:{to=James} Body:Hello London 2008-06-26 07:31:55,843 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-0 -> node4 To[mock:b] InOnly Properties:{CamelCauseException=null} Headers:{to=James} Body:Hello London 2008-06-26 07:31:55,859 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-1 -> node5 Interceptor[Delegate(Pipeline[DeadLetterChannel[Delegate(TraceInterceptor[Processor[MyProcessor]]), ... 2008-06-26 07:31:55,859 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-1 -> node2 Processor[MyProcessor] InOnly Properties:{CamelCauseException=null} Headers:{from=Claus} Body:This is Copenhagen calling 2008-06-26 07:31:55,875 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-1 -> node3 To[mock:a] InOnly Properties:{CamelCauseException=null} Headers:{from=Claus} Body:This is Copenhagen calling 2008-06-26 07:31:55,875 [main ] INFO TraceInterceptor - ID-claus-acer/3690-1214458315718/2-1 -> node4 To[mock:b] InOnly Properties:{CamelCauseException=null} Headers:{from=Claus} Body:This is Copenhagen calling
Configuring from Java DSL
The tracer options can be configured from the Java DSL like this:
public void configure() throws Exception { // add tracer as an interceptor so it will log the exchange executions at runtime // this can aid us to understand/see how the exchanges is routed etc. Tracer tracer = new Tracer(); tracer.getFormatter().setShowBreadCrumb(false); tracer.getFormatter().setShowNode(false); ... getContext().addInterceptStrategy(tracer);
Enabling from Spring XML
There is now a trace attribute you can specify on the *<camelContext/> for example
<camelContext trace="true" xmlns="http://activemq.apache.org/camel/schema/spring"> ... </camelContext>
You can see this in action with the SpringTraceTest and its spring.xml file
Another option is to just include a spring XML which defines the Tracer bean such as the one that is automatically included if you run the Main with -t above.
Formatting from Spring
In Camel 1.5 you can configure the formatting of tracer as a Spring bean. Just add a bean with the id traceFormatter and Camel will lookup this id and use the formatter, as the example below illustrates: