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 */
017
018 package org.apache.commons.logging.impl;
019
020 import org.apache.avalon.framework.logger.Logger;
021 import org.apache.commons.logging.Log;
022
023 /**
024 * Implementation of commons-logging Log interface that delegates all
025 * logging calls to the Avalon logging abstraction: the Logger interface.
026 * <p>
027 * There are two ways in which this class can be used:
028 * <ul>
029 * <li>the instance can be constructed with an Avalon logger
030 * (by calling {@link #AvalonLogger(Logger)}). In this case, it acts
031 * as a simple thin wrapping implementation over the logger. This is
032 * particularly useful when using a property setter.
033 * </li>
034 * <li>the {@link #setDefaultLogger} class property can be called which
035 * sets the ancestral Avalon logger for this class. Any <code>AvalonLogger</code>
036 * instances created through the <code>LogFactory</code> mechanisms will output
037 * to child loggers of this <code>Logger</code>.
038 * </li>
039 * </ul>
040 * <p>
041 * <strong>Note:</strong> <code>AvalonLogger</code> does not implement Serializable
042 * because the constructors available for it make this impossible to achieve in all
043 * circumstances; there is no way to "reconnect" to an underlying Logger object on
044 * deserialization if one was just passed in to the constructor of the original
045 * object. This class <i>was</i> marked Serializable in the 1.0.4 release of
046 * commons-logging, but this never actually worked (a NullPointerException would
047 * be thrown as soon as the deserialized object was used), so removing this marker
048 * is not considered to be an incompatible change.
049 *
050 * @version $Id: AvalonLogger.html 862526 2013-05-20 17:07:42Z tn $
051 */
052 public class AvalonLogger implements Log {
053
054 /** Ancestral Avalon logger. */
055 private static volatile Logger defaultLogger = null;
056 /** Avalon logger used to perform log. */
057 private final transient Logger logger;
058
059 /**
060 * Constructs an <code>AvalonLogger</code> that outputs to the given
061 * <code>Logger</code> instance.
062 *
063 * @param logger the Avalon logger implementation to delegate to
064 */
065 public AvalonLogger(Logger logger) {
066 this.logger = logger;
067 }
068
069 /**
070 * Constructs an <code>AvalonLogger</code> that will log to a child
071 * of the <code>Logger</code> set by calling {@link #setDefaultLogger}.
072 *
073 * @param name the name of the avalon logger implementation to delegate to
074 */
075 public AvalonLogger(String name) {
076 if (defaultLogger == null) {
077 throw new NullPointerException("default logger has to be specified if this constructor is used!");
078 }
079 this.logger = defaultLogger.getChildLogger(name);
080 }
081
082 /**
083 * Gets the Avalon logger implementation used to perform logging.
084 *
085 * @return avalon logger implementation
086 */
087 public Logger getLogger() {
088 return logger;
089 }
090
091 /**
092 * Sets the ancestral Avalon logger from which the delegating loggers will descend.
093 *
094 * @param logger the default avalon logger,
095 * in case there is no logger instance supplied in constructor
096 */
097 public static void setDefaultLogger(Logger logger) {
098 defaultLogger = logger;
099 }
100
101 /**
102 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
103 *
104 * @param message to log
105 * @param t log this cause
106 * @see org.apache.commons.logging.Log#debug(Object, Throwable)
107 */
108 public void debug(Object message, Throwable t) {
109 if (getLogger().isDebugEnabled()) {
110 getLogger().debug(String.valueOf(message), t);
111 }
112 }
113
114 /**
115 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
116 *
117 * @param message to log.
118 * @see org.apache.commons.logging.Log#debug(Object)
119 */
120 public void debug(Object message) {
121 if (getLogger().isDebugEnabled()) {
122 getLogger().debug(String.valueOf(message));
123 }
124 }
125
126 /**
127 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.error</code>.
128 *
129 * @param message to log
130 * @param t log this cause
131 * @see org.apache.commons.logging.Log#error(Object, Throwable)
132 */
133 public void error(Object message, Throwable t) {
134 if (getLogger().isErrorEnabled()) {
135 getLogger().error(String.valueOf(message), t);
136 }
137 }
138
139 /**
140 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.error</code>.
141 *
142 * @param message to log
143 * @see org.apache.commons.logging.Log#error(Object)
144 */
145 public void error(Object message) {
146 if (getLogger().isErrorEnabled()) {
147 getLogger().error(String.valueOf(message));
148 }
149 }
150
151 /**
152 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.fatalError</code>.
153 *
154 * @param message to log.
155 * @param t log this cause.
156 * @see org.apache.commons.logging.Log#fatal(Object, Throwable)
157 */
158 public void fatal(Object message, Throwable t) {
159 if (getLogger().isFatalErrorEnabled()) {
160 getLogger().fatalError(String.valueOf(message), t);
161 }
162 }
163
164 /**
165 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.fatalError</code>.
166 *
167 * @param message to log
168 * @see org.apache.commons.logging.Log#fatal(Object)
169 */
170 public void fatal(Object message) {
171 if (getLogger().isFatalErrorEnabled()) {
172 getLogger().fatalError(String.valueOf(message));
173 }
174 }
175
176 /**
177 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.info</code>.
178 *
179 * @param message to log
180 * @param t log this cause
181 * @see org.apache.commons.logging.Log#info(Object, Throwable)
182 */
183 public void info(Object message, Throwable t) {
184 if (getLogger().isInfoEnabled()) {
185 getLogger().info(String.valueOf(message), t);
186 }
187 }
188
189 /**
190 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.info</code>.
191 *
192 * @param message to log
193 * @see org.apache.commons.logging.Log#info(Object)
194 */
195 public void info(Object message) {
196 if (getLogger().isInfoEnabled()) {
197 getLogger().info(String.valueOf(message));
198 }
199 }
200
201 /**
202 * Is logging to <code>org.apache.avalon.framework.logger.Logger.debug</code> enabled?
203 * @see org.apache.commons.logging.Log#isDebugEnabled()
204 */
205 public boolean isDebugEnabled() {
206 return getLogger().isDebugEnabled();
207 }
208
209 /**
210 * Is logging to <code>org.apache.avalon.framework.logger.Logger.error</code> enabled?
211 * @see org.apache.commons.logging.Log#isErrorEnabled()
212 */
213 public boolean isErrorEnabled() {
214 return getLogger().isErrorEnabled();
215 }
216
217 /**
218 * Is logging to <code>org.apache.avalon.framework.logger.Logger.fatalError</code> enabled?
219 * @see org.apache.commons.logging.Log#isFatalEnabled()
220 */
221 public boolean isFatalEnabled() {
222 return getLogger().isFatalErrorEnabled();
223 }
224
225 /**
226 * Is logging to <code>org.apache.avalon.framework.logger.Logger.info</code> enabled?
227 * @see org.apache.commons.logging.Log#isInfoEnabled()
228 */
229 public boolean isInfoEnabled() {
230 return getLogger().isInfoEnabled();
231 }
232
233 /**
234 * Is logging to <code>org.apache.avalon.framework.logger.Logger.debug</code> enabled?
235 * @see org.apache.commons.logging.Log#isTraceEnabled()
236 */
237 public boolean isTraceEnabled() {
238 return getLogger().isDebugEnabled();
239 }
240
241 /**
242 * Is logging to <code>org.apache.avalon.framework.logger.Logger.warn</code> enabled?
243 * @see org.apache.commons.logging.Log#isWarnEnabled()
244 */
245 public boolean isWarnEnabled() {
246 return getLogger().isWarnEnabled();
247 }
248
249 /**
250 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
251 *
252 * @param message to log.
253 * @param t log this cause.
254 * @see org.apache.commons.logging.Log#trace(Object, Throwable)
255 */
256 public void trace(Object message, Throwable t) {
257 if (getLogger().isDebugEnabled()) {
258 getLogger().debug(String.valueOf(message), t);
259 }
260 }
261
262 /**
263 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.debug</code>.
264 *
265 * @param message to log
266 * @see org.apache.commons.logging.Log#trace(Object)
267 */
268 public void trace(Object message) {
269 if (getLogger().isDebugEnabled()) {
270 getLogger().debug(String.valueOf(message));
271 }
272 }
273
274 /**
275 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.warn</code>.
276 *
277 * @param message to log
278 * @param t log this cause
279 * @see org.apache.commons.logging.Log#warn(Object, Throwable)
280 */
281 public void warn(Object message, Throwable t) {
282 if (getLogger().isWarnEnabled()) {
283 getLogger().warn(String.valueOf(message), t);
284 }
285 }
286
287 /**
288 * Logs a message with <code>org.apache.avalon.framework.logger.Logger.warn</code>.
289 *
290 * @param message to log
291 * @see org.apache.commons.logging.Log#warn(Object)
292 */
293 public void warn(Object message) {
294 if (getLogger().isWarnEnabled()) {
295 getLogger().warn(String.valueOf(message));
296 }
297 }
298 }