001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.builder;
018
019import org.apache.camel.LoggingLevel;
020import org.apache.camel.Processor;
021import org.apache.camel.processor.LoggingErrorHandler;
022import org.apache.camel.processor.RedeliveryPolicy;
023import org.apache.camel.spi.RouteContext;
024import org.apache.camel.util.CamelLogger;
025import org.slf4j.Logger;
026import org.slf4j.LoggerFactory;
027
028/**
029 * Uses the {@link Logger} as an error handler, will log at <tt>ERROR</tt> level by default.
030 *
031 * @version 
032 */
033public class LoggingErrorHandlerBuilder extends ErrorHandlerBuilderSupport {
034    private Logger log = LoggerFactory.getLogger(Logger.class);
035    private LoggingLevel level = LoggingLevel.ERROR;
036
037    public LoggingErrorHandlerBuilder() {
038    }
039
040    public LoggingErrorHandlerBuilder(final Logger log) {
041        this.log = log;
042    }
043
044    public LoggingErrorHandlerBuilder(final Logger log, final LoggingLevel level) {
045        this.log = log;
046        this.level = level;
047    }
048
049    public boolean supportTransacted() {
050        return false;
051    }
052
053    @Override
054    public ErrorHandlerBuilder cloneBuilder() {
055        LoggingErrorHandlerBuilder answer = new LoggingErrorHandlerBuilder();
056        cloneBuilder(answer);
057        return answer;
058    }
059
060    protected void cloneBuilder(LoggingErrorHandlerBuilder other) {
061        super.cloneBuilder(other);
062
063        other.level = level;
064        other.log = log;
065    }
066
067    public Processor createErrorHandler(final RouteContext routeContext, final Processor processor) {
068        CamelLogger logger = new CamelLogger(log, level);
069
070        // configure policy to use the selected logging level, and only log exhausted
071        RedeliveryPolicy policy = new RedeliveryPolicy();
072        policy.setLogExhausted(true);
073        policy.setRetriesExhaustedLogLevel(level);
074        policy.setLogStackTrace(true);
075        policy.setLogRetryAttempted(false);
076        policy.setRetryAttemptedLogLevel(LoggingLevel.OFF);
077        policy.setLogRetryStackTrace(false);
078        policy.setLogContinued(false);
079        policy.setLogHandled(false);
080
081        LoggingErrorHandler handler = new LoggingErrorHandler(routeContext.getCamelContext(), processor, logger,
082                policy, getExceptionPolicyStrategy());
083        configure(routeContext, handler);
084        return handler;
085    }
086
087    public LoggingLevel getLevel() {
088        return level;
089    }
090
091    public void setLevel(final LoggingLevel level) {
092        this.level = level;
093    }
094
095    public Logger getLog() {
096        return log;
097    }
098
099    public void setLog(final Logger log) {
100        this.log = log;
101    }
102
103    public String getLogName() {
104        return log != null ? log.getName() : null;
105    }
106
107    public void setLogName(String logName) {
108        this.log = LoggerFactory.getLogger(logName);
109    }
110
111    public LoggingErrorHandlerBuilder level(final LoggingLevel level) {
112        this.level = level;
113        return this;
114    }
115
116    public LoggingErrorHandlerBuilder log(final Logger log) {
117        this.log = log;
118        return this;
119    }
120
121    public LoggingErrorHandlerBuilder logName(final String logName) {
122        setLogName(logName);
123        return this;
124    }
125
126}