camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Tracer (page edited)
Date Fri, 26 Jun 2009 05:45:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL">CAMEL</a> :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tracer">Tracer</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tracer">Tracer</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(Jun 25, 2009)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=89192&originalVersion=31&revisedVersion=32">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h2><a name="Tracer-TracerInterceptor"></a>Tracer Interceptor</h2>

<p>Camel supports a tracer interceptor that is used for logging the route executions at <tt>INFO</tt> level.</p>

<p>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.</p>

<p>You can enable or disable the Tracer's logging dynamically, by calling the tracer's <tt>setEnabled</tt> method.</p>

<table cellpadding='5' width='85%' cellspacing='8px' class='infoMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>The <tt>org.apache.camel.processor.interceptor.TraceFormatter</tt> has been rename to <tt>org.apache.camel.processor.interceptor.DefaultTraceFormatter</tt> in Camel 2.0.</p>

<p>Users of Camel 1.x should use <tt>TraceFormatter</tt> whereas 2.x users should use <tt>DefaultTraceFormatter</tt>.</p></td></tr></table>

<h3><a name="Tracer-Options"></a>Options</h3>
<p>Trace has been improved in <b>Camel 1.5</b> to be more configurable with these options:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Option </th>
<th class='confluenceTh'> Default </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> formatter </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Sets the Trace Formatter to use. Will default use <tt>org.apache.camel.processor.interceptor.DefaultTraceFormatter</tt>. </td>
</tr>
<tr>
<td class='confluenceTd'> enabled </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Flag to enable or disable this tracer </td>
</tr>
<tr>
<td class='confluenceTd'> logLevel </td>
<td class='confluenceTd'> <tt>INFO</tt> </td>
<td class='confluenceTd'> The logging level to use: FATAL, ERROR, WARN, INFO, DEBUG, TRACE </td>
</tr>
<tr>
<td class='confluenceTd'> logName </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> The log name to use. Will default use <tt>org.apache.camel.processor.interceptor.TraceInterceptor</tt>.</td>
</tr>
<tr>
<td class='confluenceTd'> traceFilter </td>
<td class='confluenceTd'> null </td>
<td class='confluenceTd'> An exchange <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> to filter the tracing. </td>
</tr>
<tr>
<td class='confluenceTd'> traceInterceptors </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> Flag to enable or disable tracing of interceptors </td>
</tr>
<tr>
<td class='confluenceTd'> traceExceptions </td>
<td class='confluenceTd'> true</td>
<td class='confluenceTd'> Flag to enable or disable tracing of thrown exception during processing of the exchange </td>
</tr>
<tr>
<td class='confluenceTd'> logStackTrace </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> When tracing exception you can control whether the stack trace should be logged also. If <b>not</b> then only the exception class and message is logged. </td>
</tr>
<tr>
<td class='confluenceTd'> destinationUri </td>
<td class='confluenceTd'> null </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Optional destination uri to route <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/interceptor/TraceEventExchange.html" title="Visit page outside Confluence" rel="nofollow">TraceEventExchange<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> containing <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/interceptor/TraceEventMessage.html" title="Visit page outside Confluence" rel="nofollow">TraceEventMessage<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> with details about the trace. Can be used for custom processing to store traces in database using <a href="/confluence/display/CAMEL/JPA" title="JPA">JPA</a>. </td>
</tr>
</tbody></table>

<h3><a name="Tracer-Formatting"></a>Formatting</h3>
<p>The tracer formats the execution of exchanges to log lines. They are logged at INFO level in the log category: <tt>org.apache.camel.processor.interceptor.TraceInterceptor</tt>.<br/>
The tracer uses by default <tt>TraceFormatter</tt> to format the log line.</p>

<p>TraceFormatter has the following options:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Option </th>
<th class='confluenceTh'> Default </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> breadCrumbLength </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> <b>Camel 1.5.1:</b> Fixed length of the bread crumb. 0 = no fixed length. Setting a value to e.g. 80 allows the tracer logs to be aligned for easier reading. </td>
</tr>
<tr>
<td class='confluenceTd'> nodeLength </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> <b>Camel 1.5.1:</b> Fixed length of the node. 0 = no fixed length. Setting a value to e.g. 40 allows the tracer logs to be aligned for easier reading.</td>
</tr>
<tr>
<td class='confluenceTd'> showBreadCrumb </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Outputs the unique unit of work for the exchange. To be used for correlation so you can identify the same exchange. </td>
</tr>
<tr>
<td class='confluenceTd'> showNode </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> In <b>Camel 1.x</b> its the destination node. In <b>Camel 2.0</b> its both the previous and destination node, so you can see from -&gt; to. </td>
</tr>
<tr>
<td class='confluenceTd'> showExchangeId </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> To output the unique exchange id. Currently the breadcrumb is sufficient. </td>
</tr>
<tr>
<td class='confluenceTd'> showShortExchangeId </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> <b>Camel 1.5.1:</b> To output the unique exchange id in short form, without the hostname. </td>
</tr>
<tr>
<td class='confluenceTd'> showProperties </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Output the exchange properties </td>
</tr>
<tr>
<td class='confluenceTd'> showHeaders </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Output the in message headers </td>
</tr>
<tr>
<td class='confluenceTd'> showBodyType </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Output the in body Java type </td>
</tr>
<tr>
<td class='confluenceTd'> showBody </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> Output the in body </td>
</tr>
<tr>
<td class='confluenceTd'> showOutHeaders </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Output the out (if any) message headers </td>
</tr>
<tr>
<td class='confluenceTd'> showOutBodyType </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Output the out (if any) body Java type </td>
</tr>
<tr>
<td class='confluenceTd'> showOutBody </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Output the out (if any) body </td>
</tr>
<tr>
<td class='confluenceTd'> showExchangePattern </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> <b>Camel 1.5:</b> Output the exchange pattern </td>
</tr>
<tr>
<td class='confluenceTd'> showException </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> <b>Camel 1.5:</b> Output the exception if the exchange has failed </td>
</tr>
<tr>
<td class='confluenceTd'> maxChars </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Is used to limit the number of chars logged per line. </td>
</tr>
</tbody></table>

<p>Example:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">ID-claus-acer/4412-1222625653890/2-0 -&gt; to(mock:a)                , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London</pre>
</div></div>

<p><tt>ID-claus-acer/3690-1214458315718/2-0</tt> is the breadcrumb with the unique correlation id.<br/>
<tt>node3</tt> is the id of the node in the route path. Is always shown.<br/>
<tt>To[mock:a]</tt> is the destination node.<br/>
<tt>InOnly</tt> is the exchange pattern. Is always shown.<br/>
Then the rest is properties, headers and the body.</p>

<h4><a name="Tracer-Showingfromandto"></a>Showing from and to</h4>
<p>In <b>Camel 2.0</b> the trace log will output both the from and to so you can see where the Exchange came from, such as:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">&gt;&gt;&gt; direct:start --&gt; process(MyProcessor)
&gt;&gt;&gt; process(MyProcessor) --&gt; to(mock:a)
&gt;&gt;&gt; to(mock:a) --&gt; to(mock:b)</pre>
</div></div>

<h3><a name="Tracer-Enabling"></a>Enabling</h3>

<p>To enable tracer from the main run</p>

<div class="code"><div class="codeContent">
<pre class="code-java">java org.apache.camel.spring.Main -t</pre>
</div></div>
<p>or </p>
<div class="code"><div class="codeContent">
<pre class="code-java">java org.apache.camel.spring.Main -trace</pre>
</div></div>

<p>and the tracer will be active.</p>

<h3><a name="Tracer-EnablingfromJavaDSL"></a>Enabling from Java DSL</h3>
<p>The tracer can be enabled by adding it to the interceptor chain to the camel context. This is demonstrated in the unit test below.<br/>
<b>Notice:</b> We could have changed the properties on the Tracer object before adding it, if we e.g. don't like the default settings.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> void testSendingSomeMessages() <span class="code-keyword">throws</span> Exception {
    template.sendBodyAndHeader(<span class="code-quote">"direct:start"</span>, <span class="code-quote">"Hello London"</span>, <span class="code-quote">"to"</span>, <span class="code-quote">"James"</span>);
    template.sendBodyAndHeader(<span class="code-quote">"direct:start"</span>, <span class="code-quote">"This is Copenhagen calling"</span>, <span class="code-quote">"from"</span>, <span class="code-quote">"Claus"</span>);
}

<span class="code-keyword">protected</span> RouteBuilder createRouteBuilder() <span class="code-keyword">throws</span> Exception {
    <span class="code-keyword">return</span> <span class="code-keyword">new</span> RouteBuilder() {
        <span class="code-keyword">public</span> void configure() <span class="code-keyword">throws</span> Exception {
            <span class="code-comment">// add tracer as an interceptor so it will log the exchange executions at runtime
</span>            <span class="code-comment">// <span class="code-keyword">this</span> can aid us to understand/see how the exchanges is routed etc.
</span>            getContext().addInterceptStrategy(<span class="code-keyword">new</span> Tracer());

            from(<span class="code-quote">"direct:start"</span>).
                    process(<span class="code-keyword">new</span> Processor() {
                        <span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
                            <span class="code-comment">// <span class="code-keyword">do</span> nothing
</span>                        }

                        @Override
                        <span class="code-keyword">public</span> <span class="code-object">String</span> toString() {
                            <span class="code-keyword">return</span> <span class="code-quote">"MyProcessor"</span>;
                        }
                    }).
                    to(<span class="code-quote">"mock:a"</span>).
                    to(<span class="code-quote">"mock:b"</span>);
        }
    };
}</pre>
</div></div>

<p>Running the test we get the trace information logged at INFO level:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -&gt; process(MyProcessor)      , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -&gt; to(mock:a)                , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -&gt; to(mock:b)                , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -&gt; process(MyProcessor)      , Pattern:InOnly , Headers:{from=Claus} , BodyType:<span class="code-object">String</span> , Body:This is Copenhagen calling 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -&gt; to(mock:a)                , Pattern:InOnly , Headers:{from=Claus} , BodyType:<span class="code-object">String</span> , Body:This is Copenhagen calling 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -&gt; to(mock:b)                , Pattern:InOnly , Headers:{from=Claus} , BodyType:<span class="code-object">String</span> , Body:This is Copenhagen calling</pre>
</div></div>

<h3><a name="Tracer-ConfiguringfromJavaDSL"></a>Configuring from Java DSL</h3>
<p>The tracer options can be configured from the Java DSL like this:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> void configure() <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// add tracer as an interceptor so it will log the exchange executions at runtime
</span>        <span class="code-comment">// <span class="code-keyword">this</span> can aid us to understand/see how the exchanges is routed etc.
</span>        Tracer tracer = <span class="code-keyword">new</span> Tracer();
        tracer.getFormatter().setShowBreadCrumb(<span class="code-keyword">false</span>);
        tracer.getFormatter().setShowNode(<span class="code-keyword">false</span>);
        ...
        getContext().addInterceptStrategy(tracer);</pre>
</div></div>

<h4><a name="Tracer-Usingpredicatestofilterexchanges"></a>Using predicates to filter exchanges</h4>
<p><b>Available as of Camel 1.5</b><br/>
In the code below we want the tracer only to trace if the body contains the text <tt>London</tt>. As this is just an example can of course set any <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> that matches your criteria:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Tracer tracer = <span class="code-keyword">new</span> Tracer();
    <span class="code-comment">// set the level to FATAL so we can easily spot it
</span>    tracer.setLogLevel(LoggingLevel.FATAL);
    <span class="code-comment">// and only trace <span class="code-keyword">if</span> the body contains London as text
</span>    tracer.setTraceFilter(body().contains(constant(<span class="code-quote">"London"</span>)));
    <span class="code-comment">// <span class="code-keyword">do</span> not show exchange pattern
</span>    tracer.getFormatter().setShowExchangePattern(<span class="code-keyword">false</span>);</pre>
</div></div>

<h3><a name="Tracer-EnablingfromSpringXML"></a>Enabling from Spring XML</h3>

<p>There is now a <b>trace</b> attribute you can specify on the *&lt;camelContext/&gt; for example</p>

<div class="code"><div class="codeContent">
<pre class="code-java">&lt;camelContext trace=<span class="code-quote">"<span class="code-keyword">true</span>"</span> xmlns=<span class="code-quote">"http:<span class="code-comment">//activemq.apache.org/camel/schema/spring"</span>&gt;
</span>    ...
  &lt;/camelContext&gt;</pre>
</div></div>

<p>You can see this in action with the <span class="nobr"><a href="http://svn.apache.org/repos/asf/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringTraceTest.java" title="Visit page outside Confluence" rel="nofollow">SpringTraceTest<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> and its <span class="nobr"><a href="http://svn.apache.org/repos/asf/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringTraceTest-context.xml" title="Visit page outside Confluence" rel="nofollow">spring.xml file<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<p>Another option is to just include a spring XML which defines the Tracer bean such as the <span class="nobr"><a href="http://svn.apache.org/repos/asf/camel/trunk/components/camel-spring/src/main/resources/META-INF/services/org/apache/camel/spring/trace.xml" title="Visit page outside Confluence" rel="nofollow">one that is automatically included if you run the Main with -t above<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.</p>

<h3><a name="Tracer-ConfigurationfromSpring"></a>Configuration from Spring</h3>
<p>In Camel 1.5 you can configure the tracer as a Spring bean. Just add a bean with the bean class <tt>org.apache.camel.processor.interceptor.Tracer</tt> and Camel will use it as the Tracer.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- we can configure the tracer by defining the tracer bean and set the properties as we like --&gt;</span></span>
<span class="code-tag"><span class="code-comment">&lt;!-- the id name can be anything its the class that must be org.apache.camel.processor.interceptor.Tracer --&gt;</span></span>
<span class="code-tag">&lt;bean id=<span class="code-quote">"camelTracer"</span> class=<span class="code-quote">"org.apache.camel.processor.interceptor.Tracer"</span>&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"traceExceptions"</span> value=<span class="code-quote">"false"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"traceInterceptors"</span> value=<span class="code-quote">"true"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"logLevel"</span> value=<span class="code-quote">"FATAL"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"logName"</span> value=<span class="code-quote">"com.mycompany.messages"</span>/&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;camelContext id=<span class="code-quote">"camel"</span> trace=<span class="code-quote">"true"</span> xmlns=<span class="code-quote">"http://camel.apache.org/schema/spring"</span>&gt;</span>
    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<h3><a name="Tracer-FormattingfromSpring"></a>Formatting from Spring</h3>
<p>In Camel 1.5 you can configure the formatting of tracer as a Spring bean. Just add a bean with the id <b>traceFormatter</b> and Camel will lookup this id and use the formatter, as the example below illustrates:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;bean id=<span class="code-quote">"traceFormatter"</span> class=<span class="code-quote">"org.apache.camel.processor.interceptor.DefaultTraceFormatter"</span>&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"showBody"</span> value=<span class="code-quote">"true"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"showBodyType"</span> value=<span class="code-quote">"false"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"showBreadCrumb"</span> value=<span class="code-quote">"false"</span>/&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"maxChars"</span> value=<span class="code-quote">"100"</span>/&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;camelContext id=<span class="code-quote">"camel"</span> trace=<span class="code-quote">"true"</span> xmlns=<span class="code-quote">"http://camel.apache.org/schema/spring"</span>&gt;</span>
    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<h3><a name="Tracer-Enabletracingofoutmessages"></a>Enable tracing of out messages</h3>
<p><b>Available as of Camel 2.0</b></p>

<p>You can now trace messages coming out of processing steps. To enable this, configure the tracer as follows</p>

<div class="code"><div class="codeContent">
<pre class="code-java">Tracer tracer = <span class="code-keyword">new</span> Tracer();
tracer.setTraceOutExchanges(<span class="code-keyword">true</span>);

<span class="code-comment">// we configure the <span class="code-keyword">default</span> trace formatter where we can
</span><span class="code-comment">// specify which fields we want in the output
</span>DefaultTraceFormatter formatter = <span class="code-keyword">new</span> DefaultTraceFormatter();
formatter.setShowOutBody(<span class="code-keyword">true</span>);
formatter.setShowOutBodyType(<span class="code-keyword">true</span>);

<span class="code-comment">// set to use our formatter
</span>tracer.setFormatter(formatter);

getContext().addInterceptStrategy(tracer);</pre>
</div></div>
<p>or</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;bean id=<span class="code-quote">"camelTracer"</span> class=<span class="code-quote">"org.apache.camel.processor.interceptor.Tracer"</span>&gt;</span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"traceOutExchanges"</span> value=<span class="code-quote">"true"</span> /&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;bean id=<span class="code-quote">"traceFormatter"</span> class=<span class="code-quote">"org.apache.camel.processor.interceptor.DefaultTraceFormatter"</span>&gt;</span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"showOutBody"</span> value=<span class="code-quote">"true"</span> /&gt;</span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"showOutBodyType"</span> value=<span class="code-quote">"true"</span> /&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span></pre>
</div></div>

<p>Running with these options, you'll get output similar to:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">INFO  TraceInterceptor - ID-mojo/59899-1225474989226/2-0 -&gt; transform(body) , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London
INFO  TraceInterceptor - transform(body) -&gt; ID-mojo/59899-1225474989226/2-0 , Pattern:InOnly , Headers:{to=James} , BodyType:<span class="code-object">String</span> , Body:Hello London , OutBodyType:<span class="code-object">String</span> , OutBody:Hello London</pre>
</div></div>

<h3><a name="Tracer-UsingCustomFormatter"></a>Using Custom Formatter</h3>
<p><b>Avaiable as of Camel 2.0</b></p>

<p>You can now implement your own <tt>org.apache.camel.processor.interceptor.TraceFormatter</tt> to be used for logging trace messages to the log. </p>

<p>The sample below shows how to configure a Tracer from Java DSL using custom formatter:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// we create a tracer where we want to use our own formatter instead of the <span class="code-keyword">default</span> one
</span>Tracer tracer = <span class="code-keyword">new</span> Tracer();

<span class="code-comment">// use our own formatter instead of the <span class="code-keyword">default</span> one
</span>MyTraceFormatter formatter = <span class="code-keyword">new</span> MyTraceFormatter();
tracer.setFormatter(formatter);

<span class="code-comment">// and we must remeber to add the tracer to Camel
</span>getContext().addInterceptStrategy(tracer);</pre>
</div></div>

<p>And here we have our custom logger that implements the <tt>TraceFormatter</tt> interface where we can construct the log message how we like:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// here we have out own formatter where we can create the output we want <span class="code-keyword">for</span> trace logs
</span><span class="code-comment">// as <span class="code-keyword">this</span> is a test we just create a simple string with * around the body
</span>class MyTraceFormatter <span class="code-keyword">implements</span> TraceFormatter {

    <span class="code-keyword">public</span> <span class="code-object">Object</span> format(TraceInterceptor interceptor, ProcessorDefinition node, Exchange exchange) {
        <span class="code-keyword">return</span> <span class="code-quote">"***"</span> + exchange.getIn().getBody(<span class="code-object">String</span>.class) + <span class="code-quote">"***"</span>;
    }
}</pre>
</div></div>

<h3><a name="Tracer-UsingDestinationforcustomprocessingandrouting"></a>Using Destination for custom processing and routing</h3>
<p><b>Avaiable as of Camel 2.0</b></p>

<p>Tracer now supports custom processing of trace events. This can be used to route a trace event to a <a href="/confluence/display/CAMEL/JPA" title="JPA">JPA</a> endpoint for persistence in a database.</p>

<p>This works by Camel creates a new <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/interceptor/TraceEventExchange.html" title="Visit page outside Confluence" rel="nofollow">TraceEventExchange<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> containing:</p>
<ul class="alternate" type="square">
	<li>snapshot of the original traced Exchange as a immutable <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/interceptor/TraceEventMessage.html" title="Visit page outside Confluence" rel="nofollow">TraceEventMessage<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> containing String values of the fields, when the interception occurred. This ensures the fields contains the exact data at the given time of interception.</li>
	<li>the original Exchange can be accessed using <tt>getTracedExchange()</tt></li>
</ul>


<table cellpadding='5' width='85%' cellspacing='8px' class='warningMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/forbidden.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>Beware to access the original Exchange to avoid causing any side effects or alter its state. Prefer to access the information from <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/interceptor/TraceEventMessage.html" title="Visit page outside Confluence" rel="nofollow">TraceEventMessage<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p></td></tr></table>

<p>Camel routes the TraceEventExchange synchronously from the point of interception. When its completed Camel will continue routing the original Exchange.</p>

<p>The sample below demonstrates this feature, where we route traced Exchanges to the ((direct:traced)) route:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// we create a tracer where we want to send TraveEvents to an endpoint
</span><span class="code-comment">// <span class="code-quote">"direct:traced"</span> where we can <span class="code-keyword">do</span> some custom processing such as storing
</span><span class="code-comment">// it in a file or a database
</span>Tracer tracer = <span class="code-keyword">new</span> Tracer();
tracer.setDestinationUri(<span class="code-quote">"direct:traced"</span>);
<span class="code-comment">// we disable regular trace logging in the log file. You can omit <span class="code-keyword">this</span> and
</span><span class="code-comment">// have both.
</span>tracer.setLogLevel(LoggingLevel.OFF);
<span class="code-comment">// and we must remeber to add the tracer to Camel
</span>getContext().addInterceptStrategy(tracer);</pre>
</div></div>

<p>Then we can configure a route for the traced messages:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">from(<span class="code-quote">"direct:traced"</span>).process(<span class="code-keyword">new</span> MyTraceMessageProcessor()).to("file:<span class="code-comment">//myapp/logs/trace);</span></pre>
</div></div>

<p>And our processor where we can process the TraceEventMessage. Here we want to create a CSV format of the trace event to be stored as a file. We do this by constructing the CSV String and the replace the IN body with our String instead of the <tt>TraceEventMessage</tt>.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">class MyTraceMessageProcessor <span class="code-keyword">implements</span> Processor {

    <span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// here we can transform the message how we like want it
</span>        TraceEventMessage msg = exchange.getIn().getBody(DefaultTraceEventMessage.class);

        <span class="code-comment">// we want to store it as a CSV with from;to;exchangeId;body
</span>        <span class="code-object">String</span> s = msg.getFromEndpointUri() + <span class="code-quote">";"</span> + msg.getToNode() + <span class="code-quote">";"</span> + msg.getExchangeId() + <span class="code-quote">";"</span> + msg.getBody();

        <span class="code-comment">// so we replace the IN body with our CSV string
</span>        exchange.getIn().setBody(s);
    }
}</pre>
</div></div>

<h3><a name="Tracer-UsingJPAasdatastorefortracemessages"></a>Using <a href="/confluence/display/CAMEL/JPA" title="JPA">JPA</a> as datastore for trace messages</h3>
<p><b>Avaiable as of Camel 2.0</b></p>

<p>See <a href="/confluence/display/CAMEL/Tracer+Example" title="Tracer Example">Tracer Example</a> for complete documentation and how to use this feature.</p>

<h3><a name="Tracer-Tracedroutepathduringruntime"></a>Traced route path during runtime</h3>
<p><b>Available as of Camel 2.0</b></p>

<p><a href="/confluence/display/CAMEL/Tracer" title="Tracer">Tracer</a> also traces the actual route path taken during runtime. Camel will store the route path taken on the UnitOfWork when <a href="/confluence/display/CAMEL/Tracer" title="Tracer">Tracer</a> is enabled. </p>

<p>The example below demonstrates how we can use that for error handling where we can determine at which node in the route graph the error triggered.<br/>
First we define our route:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">protected</span> RouteBuilder createRouteBuilder() <span class="code-keyword">throws</span> Exception {
    <span class="code-keyword">return</span> <span class="code-keyword">new</span> RouteBuilder() {
        <span class="code-keyword">public</span> void configure() <span class="code-keyword">throws</span> Exception {
            errorHandler(deadLetterChannel(<span class="code-quote">"mock:error"</span>).redeliverDelay(0).maximumRedeliveries(3));

            <span class="code-comment">// must enable tracer to trace the route path taken during runtime
</span>            context.setTracing(<span class="code-keyword">true</span>);

            <span class="code-comment">// let our my error processor handle all exceptions
</span>            onException(Exception.class).handled(<span class="code-keyword">true</span>).process(<span class="code-keyword">new</span> MyErrorProcessor());

            <span class="code-comment">// our route where an exception can be thrown from either foo or bar bean
</span>            <span class="code-comment">// so we have enable tracing so we can check it at runtime to get the actual
</span>            <span class="code-comment">// node path taken
</span>            from(<span class="code-quote">"direct:start"</span>).to(<span class="code-quote">"bean:foo"</span>).to(<span class="code-quote">"bean:bar"</span>);
        }
    };
}</pre>
</div></div>

<p>And then our custom error processor where we can handle the exception and figure out at which node the exception occurred.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> class MyErrorProcessor <span class="code-keyword">implements</span> Processor {
    <span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// <span class="code-keyword">cast</span> to TraceableUnitOfWork so we can work on the intercepted node path
</span>        TraceableUnitOfWork tuow = (TraceableUnitOfWork) exchange.getUnitOfWork();

        <span class="code-comment">// get the list of intercepted nodes
</span>        List&lt;ProcessorDefinition&gt; list = tuow.getInterceptedNodes();
        <span class="code-comment">// get the 2nd last as the last is me (MyErrorProcessor)
</span>        ProcessorDefinition last = list.get(list.size() - 2);

        <span class="code-comment">// set error message
</span>        exchange.getFault().setBody(<span class="code-quote">"Failed at: "</span> + last.getLabel());
    }
}</pre>
</div></div>

<h3><a name="Tracer-SeeAlso"></a>See Also</h3>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/Tracer+Example" title="Tracer Example">Tracer Example</a></li>
	<li><a href="/confluence/display/CAMEL/Debugger" title="Debugger">Debugger</a></li>
	<li><a href="/confluence/display/CAMEL/Delay+Interceptor" title="Delay Interceptor">Delay Interceptor</a></li>
</ul>
</div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message