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 * https://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 018package org.apache.commons.logging.impl; 019 020import java.io.Serializable; 021 022import org.apache.commons.logging.Log; 023import org.apache.log4j.Level; 024import org.apache.log4j.Logger; 025import org.apache.log4j.Priority; 026 027/** 028 * Implements {@link Log} to map directly to a 029 * <strong>Logger</strong> for Apache Log4J version 1.2. 030 * <p> 031 * Initial configuration of the corresponding Logger instances should be done 032 * in the usual manner, as outlined in the Log4J documentation. 033 * </p> 034 * <p> 035 * The reason this logger is distinct from the 1.3.0 logger is that in version 1.2 036 * of Log4J: 037 * </p> 038 * <ul> 039 * <li>class Logger takes Priority parameters not Level parameters.</li> 040 * <li>class Level extends Priority</li> 041 * </ul> 042 * <p> 043 * Log4j 1.3 is expected to change Level so it no longer extends Priority, which is 044 * a non-binary-compatible change. The class generated by compiling this code against 045 * Log4j 1.2 will therefore not run against Log4j 1.3. 046 * </p> 047 * 048 * @deprecated Scheduled for removal since version 1.x of Log4j has reached end-of-life. 049 */ 050@Deprecated 051public class Log4JLogger implements Log, Serializable { 052 053 /** Serializable version identifier. */ 054 private static final long serialVersionUID = 5160705895411730424L; 055 056 /** The fully qualified name of the Log4JLogger class. */ 057 private static final String FQCN = Log4JLogger.class.getName(); 058 059 private static final Priority TRACE_LEVEL; 060 061 // 062 // Note that this must come after the static variable declarations 063 // otherwise initializer expressions associated with those variables 064 // will override any settings done here. 065 // 066 // Verify that Log4j is available, and that it is version 1.2. 067 // If an ExceptionInInitializerError is generated, then LogFactoryImpl 068 // will treat that as meaning that the appropriate underlying logging 069 // library is just not present - if discovery is in progress then 070 // discovery will continue. 071 static { 072 if (!Priority.class.isAssignableFrom(Level.class)) { 073 // nope, this is Log4j 1.3, so force an ExceptionInInitializerError 074 throw new InstantiationError("Log4J 1.2 not available"); 075 } 076 // Releases of Log4j 1.2 >= 1.2.12 have Priority.TRACE available, earlier 077 // versions do not. If TRACE is not available, then we have to map 078 // calls to Log.trace(...) onto the DEBUG level. 079 Priority traceLevel; 080 try { 081 traceLevel = (Priority) Level.class.getDeclaredField("TRACE").get(null); 082 } catch (final Exception ex) { 083 // ok, trace not available 084 traceLevel = Level.DEBUG; 085 } 086 TRACE_LEVEL = traceLevel; 087 } 088 089 /** Log to this logger */ 090 private transient volatile Logger logger; 091 092 /** Logger name */ 093 private final String name; 094 095 /** 096 * Constructs a new instance. 097 */ 098 public Log4JLogger() { 099 name = null; 100 } 101 102 /** 103 * For use with a Log4j factory. 104 * 105 * @param logger Logger. 106 */ 107 public Log4JLogger(final Logger logger) { 108 if (logger == null) { 109 throw new IllegalArgumentException("Warning - null logger in constructor; possible Log4j misconfiguration."); 110 } 111 this.name = logger.getName(); 112 this.logger = logger; 113 } 114 115 /** 116 * Base constructor. 117 * 118 * @param name name. 119 */ 120 public Log4JLogger(final String name) { 121 this.name = name; 122 this.logger = getLogger(); 123 } 124 125 /** 126 * Logs a message with {@code org.apache.log4j.Priority.DEBUG}. 127 * 128 * @param message to log 129 * @see org.apache.commons.logging.Log#debug(Object) 130 */ 131 @Override 132 public void debug(final Object message) { 133 getLogger().log(FQCN, Level.DEBUG, message, null); 134 } 135 136 /** 137 * Logs a message with {@code org.apache.log4j.Priority.DEBUG}. 138 * 139 * @param message to log 140 * @param t log this cause 141 * @see org.apache.commons.logging.Log#debug(Object, Throwable) 142 */ 143 @Override 144 public void debug(final Object message, final Throwable t) { 145 getLogger().log(FQCN, Level.DEBUG, message, t); 146 } 147 148 /** 149 * Logs a message with {@code org.apache.log4j.Priority.ERROR}. 150 * 151 * @param message to log 152 * @see org.apache.commons.logging.Log#error(Object) 153 */ 154 @Override 155 public void error(final Object message) { 156 getLogger().log(FQCN, Level.ERROR, message, null); 157 } 158 159 /** 160 * Logs a message with {@code org.apache.log4j.Priority.ERROR}. 161 * 162 * @param message to log 163 * @param t log this cause 164 * @see org.apache.commons.logging.Log#error(Object, Throwable) 165 */ 166 @Override 167 public void error(final Object message, final Throwable t) { 168 getLogger().log(FQCN, Level.ERROR, message, t); 169 } 170 171 /** 172 * Logs a message with {@code org.apache.log4j.Priority.FATAL}. 173 * 174 * @param message to log 175 * @see org.apache.commons.logging.Log#fatal(Object) 176 */ 177 @Override 178 public void fatal(final Object message) { 179 getLogger().log(FQCN, Level.FATAL, message, null); 180 } 181 182 /** 183 * Logs a message with {@code org.apache.log4j.Priority.FATAL}. 184 * 185 * @param message to log 186 * @param t log this cause 187 * @see org.apache.commons.logging.Log#fatal(Object, Throwable) 188 */ 189 @Override 190 public void fatal(final Object message, final Throwable t) { 191 getLogger().log(FQCN, Level.FATAL, message, t); 192 } 193 194 /** 195 * Gets the native Logger instance we are using. 196 * 197 * @return the native Logger instance we are using. 198 */ 199 public Logger getLogger() { 200 Logger result = logger; 201 if (result == null) { 202 synchronized(this) { 203 result = logger; 204 if (result == null) { 205 logger = result = Logger.getLogger(name); 206 } 207 } 208 } 209 return result; 210 } 211 212 /** 213 * Logs a message with {@code org.apache.log4j.Priority.INFO}. 214 * 215 * @param message to log 216 * @see org.apache.commons.logging.Log#info(Object) 217 */ 218 @Override 219 public void info(final Object message) { 220 getLogger().log(FQCN, Level.INFO, message, null); 221 } 222 223 /** 224 * Logs a message with {@code org.apache.log4j.Priority.INFO}. 225 * 226 * @param message to log 227 * @param t log this cause 228 * @see org.apache.commons.logging.Log#info(Object, Throwable) 229 */ 230 @Override 231 public void info(final Object message, final Throwable t) { 232 getLogger().log(FQCN, Level.INFO, message, t); 233 } 234 235 /** 236 * Tests whether the Log4j Logger used is enabled for {@code DEBUG} priority. 237 */ 238 @Override 239 public boolean isDebugEnabled() { 240 return getLogger().isDebugEnabled(); 241 } 242 243 /** 244 * Tests whether the Log4j Logger used is enabled for {@code ERROR} priority. 245 */ 246 @Override 247 public boolean isErrorEnabled() { 248 return getLogger().isEnabledFor(Level.ERROR); 249 } 250 251 /** 252 * Tests whether the Log4j Logger used is enabled for {@code FATAL} priority. 253 */ 254 @Override 255 public boolean isFatalEnabled() { 256 return getLogger().isEnabledFor(Level.FATAL); 257 } 258 259 /** 260 * Tests whether the Log4j Logger used is enabled for {@code INFO} priority. 261 */ 262 @Override 263 public boolean isInfoEnabled() { 264 return getLogger().isInfoEnabled(); 265 } 266 267 /** 268 * Tests whether the Log4j Logger used is enabled for {@code TRACE} priority. 269 * When using a Log4j version that does not support the TRACE level, this call 270 * will report whether {@code DEBUG} is enabled or not. 271 */ 272 @Override 273 public boolean isTraceEnabled() { 274 return getLogger().isEnabledFor(TRACE_LEVEL); 275 } 276 277 /** 278 * Tests whether the Log4j Logger used is enabled for {@code WARN} priority. 279 */ 280 @Override 281 public boolean isWarnEnabled() { 282 return getLogger().isEnabledFor(Level.WARN); 283 } 284 285 /** 286 * Logs a message with {@code org.apache.log4j.Priority.TRACE}. 287 * When using a Log4j version that does not support the {@code TRACE} 288 * level, the message will be logged at the {@code DEBUG} level. 289 * 290 * @param message to log 291 * @see org.apache.commons.logging.Log#trace(Object) 292 */ 293 @Override 294 public void trace(final Object message) { 295 getLogger().log(FQCN, TRACE_LEVEL, message, null); 296 } 297 298 /** 299 * Logs a message with {@code org.apache.log4j.Priority.TRACE}. 300 * When using a Log4j version that does not support the {@code TRACE} 301 * level, the message will be logged at the {@code DEBUG} level. 302 * 303 * @param message to log 304 * @param t log this cause 305 * @see org.apache.commons.logging.Log#trace(Object, Throwable) 306 */ 307 @Override 308 public void trace(final Object message, final Throwable t) { 309 getLogger().log(FQCN, TRACE_LEVEL, message, t); 310 } 311 312 /** 313 * Logs a message with {@code org.apache.log4j.Priority.WARN}. 314 * 315 * @param message to log 316 * @see org.apache.commons.logging.Log#warn(Object) 317 */ 318 @Override 319 public void warn(final Object message) { 320 getLogger().log(FQCN, Level.WARN, message, null); 321 } 322 323 /** 324 * Logs a message with {@code org.apache.log4j.Priority.WARN}. 325 * 326 * @param message to log 327 * @param t log this cause 328 * @see org.apache.commons.logging.Log#warn(Object, Throwable) 329 */ 330 @Override 331 public void warn(final Object message, final Throwable t) { 332 getLogger().log(FQCN, Level.WARN, message, t); 333 } 334 335}