in core/camel-core-processor/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java [1369:1499]
private void logFailedDelivery(
boolean shouldRedeliver, boolean newException, boolean handled, boolean continued, boolean isDeadLetterChannel,
Exchange exchange, String message, Throwable e) {
if (logger == null) {
return;
}
if (!exchange.isRollbackOnly() && !exchange.isRollbackOnlyLast()) {
if (newException && !currentRedeliveryPolicy.isLogNewException()) {
// do not log new exception
return;
}
// if we should not rollback, then check whether logging is enabled
if (!newException && handled && !currentRedeliveryPolicy.isLogHandled()) {
// do not log handled
return;
}
if (!newException && continued && !currentRedeliveryPolicy.isLogContinued()) {
// do not log handled
return;
}
if (!newException && shouldRedeliver && !currentRedeliveryPolicy.isLogRetryAttempted()) {
// do not log retry attempts
return;
}
if (!newException && shouldRedeliver) {
if (currentRedeliveryPolicy.isLogRetryAttempted()) {
if (currentRedeliveryPolicy.getRetryAttemptedLogInterval() > 1
&& redeliveryCounter % currentRedeliveryPolicy.getRetryAttemptedLogInterval() != 0) {
// do not log retry attempt because it is excluded by the retryAttemptedLogInterval
return;
}
} else {
// do not log retry attempts
return;
}
}
if (!newException && !shouldRedeliver && !currentRedeliveryPolicy.isLogExhausted()) {
// do not log exhausted
return;
}
}
LoggingLevel newLogLevel;
boolean logStackTrace;
if (exchange.isRollbackOnly() || exchange.isRollbackOnlyLast()) {
newLogLevel = currentRedeliveryPolicy.getRetriesExhaustedLogLevel();
logStackTrace = currentRedeliveryPolicy.isLogStackTrace();
} else if (shouldRedeliver) {
newLogLevel = currentRedeliveryPolicy.getRetryAttemptedLogLevel();
logStackTrace = currentRedeliveryPolicy.isLogRetryStackTrace();
} else {
newLogLevel = currentRedeliveryPolicy.getRetriesExhaustedLogLevel();
logStackTrace = currentRedeliveryPolicy.isLogStackTrace();
}
if (e == null) {
e = exchange.getProperty(ExchangePropertyKey.EXCEPTION_CAUGHT, Exception.class);
}
if (newException) {
// log at most WARN level
if (newLogLevel == LoggingLevel.ERROR) {
newLogLevel = LoggingLevel.WARN;
}
String msg = message;
if (msg == null) {
msg = "New exception " + ExchangeHelper.logIds(exchange);
// special for logging the new exception
if (e != null) {
msg = msg + " due: " + e.getMessage();
}
}
if (e != null && logStackTrace) {
logger.log(msg, e, newLogLevel);
} else {
logger.log(msg, newLogLevel);
}
} else if (exchange.isRollbackOnly() || exchange.isRollbackOnlyLast()) {
String msg = "Rollback " + ExchangeHelper.logIds(exchange);
Throwable cause = exchange.getException() != null
? exchange.getException() : exchange.getProperty(ExchangePropertyKey.EXCEPTION_CAUGHT, Throwable.class);
if (cause != null) {
msg = msg + " due: " + cause.getMessage();
}
// should we include message history
if (!shouldRedeliver && currentRedeliveryPolicy.isLogExhaustedMessageHistory()) {
// only use the exchange formatter if we should log exhausted message body (and if using a custom formatter then always use it)
ExchangeFormatter formatter = customExchangeFormatter
? exchangeFormatter
: (currentRedeliveryPolicy.isLogExhaustedMessageBody() || camelContext.isLogExhaustedMessageBody()
? exchangeFormatter : null);
String routeStackTrace = MessageHelper.dumpMessageHistoryStacktrace(exchange, formatter, false);
msg = msg + "\n" + routeStackTrace;
}
if (newLogLevel == LoggingLevel.ERROR) {
// log intended rollback on maximum WARN level (not ERROR)
logger.log(msg, LoggingLevel.WARN);
} else {
// otherwise use the desired logging level
logger.log(msg, newLogLevel);
}
} else {
String msg = message;
// should we include message history
if (!shouldRedeliver && currentRedeliveryPolicy.isLogExhaustedMessageHistory()) {
// only use the exchange formatter if we should log exhausted message body (and if using a custom formatter then always use it)
ExchangeFormatter formatter = customExchangeFormatter
? exchangeFormatter
: (currentRedeliveryPolicy.isLogExhaustedMessageBody() || camelContext.isLogExhaustedMessageBody()
? exchangeFormatter : null);
String routeStackTrace
= MessageHelper.dumpMessageHistoryStacktrace(exchange, formatter, e != null && logStackTrace);
msg = msg + "\n" + routeStackTrace;
}
if (e != null && logStackTrace) {
logger.log(msg, e, newLogLevel);
} else {
logger.log(msg, newLogLevel);
}
}
}