blob: 3bfc9790877994d689e913246c422f238c5f25cb [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.log;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.Future;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.StreamCache;
import org.apache.camel.spi.ExchangeFormatter;
import org.apache.camel.util.ObjectHelper;
/**
* Logger formatter to format the logging output.
*/
public class LogFormatter implements ExchangeFormatter {
private boolean showExchangeId;
private boolean showExchangePattern = true;
private boolean showProperties;
private boolean showHeaders;
private boolean showBodyType = true;
private boolean showBody = true;
private boolean showOut;
private boolean showException;
private boolean showCaughtException;
private boolean showStackTrace;
private boolean showAll;
private boolean multiline;
private boolean showFuture;
private int maxChars;
public String format(Exchange exchange) {
Message in = exchange.getIn();
StringBuilder sb = new StringBuilder("");
if (showAll || showExchangeId) {
if (multiline) {
sb.append('\n');
}
sb.append(", Id:").append(exchange.getExchangeId());
}
if (showAll || showExchangePattern) {
if (multiline) {
sb.append('\n');
}
sb.append(", ExchangePattern:").append(exchange.getPattern());
}
if (showAll || showProperties) {
if (multiline) {
sb.append('\n');
}
sb.append(", Properties:").append(exchange.getProperties());
}
if (showAll || showHeaders) {
if (multiline) {
sb.append('\n');
}
sb.append(", Headers:").append(in.getHeaders());
}
if (showAll || showBodyType) {
if (multiline) {
sb.append('\n');
}
sb.append(", BodyType:").append(getBodyTypeAsString(in));
}
if (showAll || showBody) {
if (multiline) {
sb.append('\n');
}
sb.append(", Body:").append(getBodyAsString(in));
}
if (showAll || showException || showCaughtException) {
// try exception on exchange first
Exception exception = exchange.getException();
boolean caught = false;
if ((showAll || showCaughtException) && exception == null) {
// fallback to caught exception
exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
caught = true;
}
if (exception != null) {
if (multiline) {
sb.append('\n');
}
if (caught) {
sb.append(", CaughtExceptionType:").append(exception.getClass().getCanonicalName());
sb.append(", CaughtExceptionMessage:").append(exception.getMessage());
} else {
sb.append(", ExceptionType:").append(exception.getClass().getCanonicalName());
sb.append(", ExceptionMessage:").append(exception.getMessage());
}
if (showAll || showStackTrace) {
StringWriter sw = new StringWriter();
exception.printStackTrace(new PrintWriter(sw));
sb.append(", StackTrace:").append(sw.toString());
}
}
}
if (showAll || showOut) {
if (exchange.hasOut()) {
Message out = exchange.getOut();
if (showAll || showHeaders) {
if (multiline) {
sb.append('\n');
}
sb.append(", OutHeaders:").append(out.getHeaders());
}
if (showAll || showBodyType) {
if (multiline) {
sb.append('\n');
}
sb.append(", OutBodyType:").append(getBodyTypeAsString(out));
}
if (showAll || showBody) {
if (multiline) {
sb.append('\n');
}
sb.append(", OutBody:").append(getBodyAsString(out));
}
} else {
if (multiline) {
sb.append('\n');
}
sb.append(", Out: null");
}
}
if (maxChars > 0) {
StringBuilder answer = new StringBuilder();
for (String s : sb.toString().split("\n")) {
if (s != null) {
if (s.length() > maxChars) {
s = s.substring(0, maxChars);
answer.append(s).append("...");
} else {
answer.append(s);
}
if (multiline) {
answer.append("\n");
}
}
}
// get rid of the leading space comma if needed
return "Exchange[" + (multiline ? answer.append(']').toString() : answer.toString().substring(2) + "]");
}
// get rid of the leading space comma if needed
return "Exchange[" + (multiline ? sb.append(']').toString() : sb.toString().substring(2) + "]");
}
public boolean isShowExchangeId() {
return showExchangeId;
}
public void setShowExchangeId(boolean showExchangeId) {
this.showExchangeId = showExchangeId;
}
public boolean isShowProperties() {
return showProperties;
}
public void setShowProperties(boolean showProperties) {
this.showProperties = showProperties;
}
public boolean isShowHeaders() {
return showHeaders;
}
public void setShowHeaders(boolean showHeaders) {
this.showHeaders = showHeaders;
}
public boolean isShowBodyType() {
return showBodyType;
}
public void setShowBodyType(boolean showBodyType) {
this.showBodyType = showBodyType;
}
public boolean isShowBody() {
return showBody;
}
public void setShowBody(boolean showBody) {
this.showBody = showBody;
}
public boolean isShowOut() {
return showOut;
}
public void setShowOut(boolean showOut) {
this.showOut = showOut;
}
public boolean isShowAll() {
return showAll;
}
public void setShowAll(boolean showAll) {
this.showAll = showAll;
}
public boolean isShowException() {
return showException;
}
public void setShowException(boolean showException) {
this.showException = showException;
}
public boolean isShowStackTrace() {
return showStackTrace;
}
public void setShowStackTrace(boolean showStackTrace) {
this.showStackTrace = showStackTrace;
}
public boolean isShowCaughtException() {
return showCaughtException;
}
public void setShowCaughtException(boolean showCaughtException) {
this.showCaughtException = showCaughtException;
}
public boolean isMultiline() {
return multiline;
}
public int getMaxChars() {
return maxChars;
}
public void setMaxChars(int maxChars) {
this.maxChars = maxChars;
}
/**
* If enabled then each information is outputted on a newline.
*/
public void setMultiline(boolean multiline) {
this.multiline = multiline;
}
public boolean isShowFuture() {
return showFuture;
}
/**
* If enabled Camel will on Future objects wait for it to complete to obtain the payload to be logged.
* <p/>
* Is default disabled.
*/
public void setShowFuture(boolean showFuture) {
this.showFuture = showFuture;
}
public boolean isShowExchangePattern() {
return showExchangePattern;
}
public void setShowExchangePattern(boolean showExchangePattern) {
this.showExchangePattern = showExchangePattern;
}
// Implementation methods
//-------------------------------------------------------------------------
protected Object getBodyAsString(Message message) {
if (message.getBody() instanceof Future) {
if (!isShowFuture()) {
// just use a to string of the future object
return message.getBody().toString();
}
}
StreamCache newBody = message.getBody(StreamCache.class);
if (newBody != null) {
message.setBody(newBody);
}
Object answer = message.getBody(String.class);
if (answer == null) {
answer = message.getBody();
}
if (newBody != null) {
// Reset the StreamCache
newBody.reset();
}
return answer;
}
protected Object getBodyTypeAsString(Message message) {
String answer = ObjectHelper.classCanonicalName(message.getBody());
if (answer != null && answer.startsWith("java.lang.")) {
return answer.substring(10);
}
return answer;
}
}