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.util;
018
019import org.apache.camel.LoggingLevel;
020import org.slf4j.Logger;
021import org.slf4j.LoggerFactory;
022import org.slf4j.Marker;
023import org.slf4j.MarkerFactory;
024
025/**
026 * A logger which logs to a slf4j {@link Logger}.
027 * <p/>
028 * The name <tt>CamelLogger</tt> has been chosen to avoid any name clash with log kits
029 * which has a <tt>Logger</tt> class.
030 *
031 * @version 
032 */
033public class CamelLogger {
034    private Logger log;
035    private LoggingLevel level;
036    private Marker marker;
037
038    public CamelLogger() {
039        this(LoggerFactory.getLogger(CamelLogger.class));
040    }
041
042    public CamelLogger(Logger log) {
043        this(log, LoggingLevel.INFO);
044    }
045
046    public CamelLogger(Logger log, LoggingLevel level) {
047        this(log, level, null);
048    }
049
050    public CamelLogger(Logger log, LoggingLevel level, String marker) {
051        this.log = log;
052        setLevel(level);
053        setMarker(marker);
054    }
055
056    public CamelLogger(String logName) {
057        this(LoggerFactory.getLogger(logName));
058    }
059
060    public CamelLogger(String logName, LoggingLevel level) {
061        this(logName, level, null);
062    }
063
064    public CamelLogger(String logName, LoggingLevel level, String marker) {
065        this(LoggerFactory.getLogger(logName), level, marker);
066    }
067
068    @Override
069    public String toString() {
070        return "Logger[" + log + "]";
071    }
072
073    public void log(String message, LoggingLevel loggingLevel) {
074        LoggingLevel oldLogLevel = getLevel();
075        setLevel(loggingLevel);
076        log(message);
077        setLevel(oldLogLevel);
078    }
079
080    /**
081     * Logs the message <b>with</b> checking the {@link #shouldLog()} method first.
082     *
083     * @param message the message to log, if {@link #shouldLog()} returned <tt>true</tt>
084     */
085    public void log(String message) {
086        if (shouldLog(log, level)) {
087            log(log, level, marker, message);
088        }
089    }
090
091    /**
092     * Logs the message <b>without</b> checking the {@link #shouldLog()} method first.
093     * 
094     * @param message the message to log
095     */
096    public void doLog(String message) {
097        log(log, level, marker, message);
098    }
099
100    public void log(String message, Throwable exception, LoggingLevel loggingLevel) {
101        log(log, loggingLevel, marker, message, exception);
102    }   
103    
104    public void log(String message, Throwable exception) {
105        if (shouldLog(log, level)) {
106            log(log, level, marker, message, exception);
107        }
108    }
109
110    public Logger getLog() {
111        return log;
112    }
113
114    public void setLog(Logger log) {
115        this.log = log;
116    }
117
118    public LoggingLevel getLevel() {
119        return level;
120    }
121
122    public void setLevel(LoggingLevel level) {
123        if (level == null) {
124            throw new IllegalArgumentException("Log level may not be null");
125        }
126
127        this.level = level;
128    }
129
130    public void setLogName(String logName) {
131        this.log = LoggerFactory.getLogger(logName);
132    }
133
134    public void setMarker(Marker marker) {
135        this.marker = marker;
136    }
137
138    public void setMarker(String marker) {
139        if (ObjectHelper.isNotEmpty(marker)) {
140            this.marker = MarkerFactory.getMarker(marker);
141        } else {
142            this.marker = null;
143        }
144    }
145
146    public static void log(Logger log, LoggingLevel level, String message) {
147        switch (level) {
148        case DEBUG:
149            log.debug(message);
150            break;
151        case ERROR:
152            log.error(message);
153            break;
154        case INFO:
155            log.info(message);
156            break;
157        case TRACE:
158            log.trace(message);
159            break;
160        case WARN:
161            log.warn(message);
162            break;
163        default:
164        }
165    }
166
167    public static void log(Logger log, LoggingLevel level, Marker marker, String message) {
168        switch (level) {
169        case DEBUG:
170            log.debug(marker, message);
171            break;
172        case ERROR:
173            log.error(marker, message);
174            break;
175        case INFO:
176            log.info(marker, message);
177            break;
178        case TRACE:
179            log.trace(marker, message);
180            break;
181        case WARN:
182            log.warn(marker, message);
183            break;
184        default:
185        }
186    }
187
188    public static void log(Logger log, LoggingLevel level, String message, Throwable th) {
189        switch (level) {
190        case DEBUG:
191            log.debug(message, th);
192            break;
193        case ERROR:
194            log.error(message, th);
195            break;
196        case INFO:
197            log.info(message, th);
198            break;
199        case TRACE:
200            log.trace(message, th);
201            break;
202        case WARN:
203            log.warn(message, th);
204            break;
205        default:
206        }
207    }
208
209    public static void log(Logger log, LoggingLevel level, Marker marker, String message, Throwable th) {
210        switch (level) {
211        case DEBUG:
212            log.debug(marker, message, th);
213            break;
214        case ERROR:
215            log.error(marker, message, th);
216            break;
217        case INFO:
218            log.info(marker, message, th);
219            break;
220        case TRACE:
221            log.trace(marker, message, th);
222            break;
223        case WARN:
224            log.warn(marker, message, th);
225            break;
226        default:
227        }
228    }
229
230    public boolean shouldLog() {
231        return CamelLogger.shouldLog(log, level);
232    }
233
234    public static boolean shouldLog(Logger log, LoggingLevel level) {
235        switch (level) {
236        case DEBUG:
237            return log.isDebugEnabled(); 
238        case ERROR:
239            return log.isErrorEnabled(); 
240        case INFO:
241            return log.isInfoEnabled(); 
242        case TRACE:
243            return log.isTraceEnabled(); 
244        case WARN:
245            return log.isWarnEnabled(); 
246        default:
247        }
248        return false;
249    }
250}