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 package org.apache.commons.discovery.log;
018
019 import java.io.PrintStream;
020 import java.text.DateFormat;
021 import java.text.SimpleDateFormat;
022 import java.util.Date;
023
024 import org.apache.commons.logging.Log;
025
026 /**
027 * <p>Simple implementation of Log that sends all enabled log messages,
028 * for all defined loggers, to System.err.
029 * </p>
030 *
031 * <p>Hacked from commons-logging SimpleLog for use in discovery.
032 * This is intended to be enough of a Log implementation to bootstrap
033 * Discovery.
034 * </p>
035 *
036 * <p>One property: <code>org.apache.commons.discovery.log.level</code>.
037 * valid values: all, trace, debug, info, warn, error, fatal, off.
038 * </p>
039 *
040 * @deprecated Starting from commons-discovery-05, Log is totally delegated to commons-logging
041 * @version $Id: SimpleLog.java 1089489 2011-04-06 15:20:24Z sebb $
042 */
043 @Deprecated
044 public class SimpleLog implements Log {
045 // ---------------------------------------------------- Log Level Constants
046
047 /** "Trace" level logging. */
048 public static final int LOG_LEVEL_TRACE = 1;
049
050 /** "Debug" level logging. */
051 public static final int LOG_LEVEL_DEBUG = 2;
052
053 /** "Info" level logging. */
054 public static final int LOG_LEVEL_INFO = 3;
055
056 /** "Warn" level logging. */
057 public static final int LOG_LEVEL_WARN = 4;
058
059 /** "Error" level logging. */
060 public static final int LOG_LEVEL_ERROR = 5;
061
062 /** "Fatal" level logging. */
063 public static final int LOG_LEVEL_FATAL = 6;
064
065 /** Enable all logging levels */
066 public static final int LOG_LEVEL_ALL = (LOG_LEVEL_TRACE - 1);
067
068 /** Enable no logging levels */
069 public static final int LOG_LEVEL_OFF = (LOG_LEVEL_FATAL + 1);
070
071 // ------------------------------------------------------- Class Attributes
072
073 static protected final String PROP_LEVEL =
074 "org.apache.commons.discovery.log.level";
075
076 /** Include the instance name in the log message? */
077 static protected boolean showLogName = false;
078
079 /** Include the short name ( last component ) of the logger in the log
080 message. Default to true - otherwise we'll be lost in a flood of
081 messages without knowing who sends them.
082 */
083 static protected boolean showShortName = true;
084
085 /** Include the current time in the log message */
086 static protected boolean showDateTime = false;
087
088 /** Used to format times */
089 static protected DateFormat dateFormatter = null;
090
091 /** The current log level */
092 static protected int logLevel = LOG_LEVEL_INFO;
093
094 /**
095 * Use 'out' instead of 'err' for logging
096 * to keep in-sync with test messages.
097 */
098 static private PrintStream out = System.out;
099
100 // ------------------------------------------------------------ Initializer
101
102 // initialize class attributes
103 static {
104 if(showDateTime) {
105 dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS zzz");
106 }
107
108 try {
109 // set log level from properties
110 String lvl = System.getProperty(PROP_LEVEL);
111
112 if("all".equalsIgnoreCase(lvl)) {
113 setLevel(SimpleLog.LOG_LEVEL_ALL);
114 } else if("trace".equalsIgnoreCase(lvl)) {
115 setLevel(SimpleLog.LOG_LEVEL_TRACE);
116 } else if("debug".equalsIgnoreCase(lvl)) {
117 setLevel(SimpleLog.LOG_LEVEL_DEBUG);
118 } else if("info".equalsIgnoreCase(lvl)) {
119 setLevel(SimpleLog.LOG_LEVEL_INFO);
120 } else if("warn".equalsIgnoreCase(lvl)) {
121 setLevel(SimpleLog.LOG_LEVEL_WARN);
122 } else if("error".equalsIgnoreCase(lvl)) {
123 setLevel(SimpleLog.LOG_LEVEL_ERROR);
124 } else if("fatal".equalsIgnoreCase(lvl)) {
125 setLevel(SimpleLog.LOG_LEVEL_FATAL);
126 } else if("off".equalsIgnoreCase(lvl)) {
127 setLevel(SimpleLog.LOG_LEVEL_OFF);
128 }
129 } catch (SecurityException ignored) {
130 //do nothing. We get here if running discovery
131 //under a servlet with restricted security rights, and
132 //cannot read the system property.
133 //In which case, the default is what you get to keep.
134 }
135
136 }
137
138 // -------------------------------------------------------- Properties
139
140 /**
141 * <p> Set logging level. </p>
142 *
143 * @param currentLogLevel new logging level
144 */
145 public static void setLevel(int currentLogLevel) {
146 logLevel = currentLogLevel;
147 }
148
149 /**
150 * Get logging level.
151 *
152 * @return The logging level
153 */
154 public static int getLevel() {
155 return logLevel;
156 }
157
158 /**
159 * Is the given log level currently enabled?
160 *
161 * @param level is this level enabled?
162 * @return true, if the input level is enabled, false otherwise
163 */
164 protected static boolean isLevelEnabled(int level) {
165 // log level are numerically ordered so can use simple numeric
166 // comparison
167 return (level >= getLevel());
168 }
169
170 // ------------------------------------------------------------- Attributes
171
172 /** The name of this simple log instance */
173 protected String logName = null;
174
175 private String prefix=null;
176
177 // ------------------------------------------------------------ Constructor
178
179 /**
180 * Construct a simple log with given name.
181 *
182 * @param name log name
183 */
184 public SimpleLog(String name) {
185 logName = name;
186 }
187
188 // -------------------------------------------------------- Logging Methods
189
190 /**
191 * Do the actual logging.
192 *
193 * This method assembles the message and then prints to {@code System.err}.
194 *
195 * @param type The logging level
196 * @param message The message to log
197 * @param t The error cause, if any
198 */
199 protected void log(int type, Object message, Throwable t) {
200 // use a string buffer for better performance
201 StringBuffer buf = new StringBuffer();
202
203 // append date-time if so configured
204 if(showDateTime) {
205 buf.append(dateFormatter.format(new Date()));
206 buf.append(" ");
207 }
208
209 // append a readable representation of the log leve
210 switch(type) {
211 case SimpleLog.LOG_LEVEL_TRACE: buf.append("[TRACE] "); break;
212 case SimpleLog.LOG_LEVEL_DEBUG: buf.append("[DEBUG] "); break;
213 case SimpleLog.LOG_LEVEL_INFO: buf.append("[INFO ] "); break;
214 case SimpleLog.LOG_LEVEL_WARN: buf.append("[WARN ] "); break;
215 case SimpleLog.LOG_LEVEL_ERROR: buf.append("[ERROR] "); break;
216 case SimpleLog.LOG_LEVEL_FATAL: buf.append("[FATAL] "); break;
217 }
218
219 // append the name of the log instance if so configured
220 if( showShortName) {
221 if( prefix==null ) {
222 // cut all but the last component of the name for both styles
223 prefix = logName.substring( logName.lastIndexOf(".") +1) + " - ";
224 prefix = prefix.substring( prefix.lastIndexOf("/") +1) + "-";
225 }
226 buf.append( prefix );
227 } else if(showLogName) {
228 buf.append(String.valueOf(logName)).append(" - ");
229 }
230
231 // append the message
232 buf.append(String.valueOf(message));
233
234 // append stack trace if not null
235 if(t != null) {
236 buf.append(" <");
237 buf.append(t.toString());
238 buf.append(">");
239 }
240
241 // print to System.err
242 out.println(buf.toString());
243
244 if (t != null) {
245 t.printStackTrace(System.err);
246 }
247 }
248
249 // -------------------------------------------------------- Log Implementation
250
251 /**
252 * Log a message with debug log level.
253 *
254 * @param message The message to log
255 */
256 public final void debug(Object message) {
257 if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) {
258 log(SimpleLog.LOG_LEVEL_DEBUG, message, null);
259 }
260 }
261
262 /**
263 * Log an error with debug log level.
264 *
265 * @param message The message to log
266 * @param t The error cause, if any
267 */
268 public final void debug(Object message, Throwable t) {
269 if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) {
270 log(SimpleLog.LOG_LEVEL_DEBUG, message, t);
271 }
272 }
273
274 /**
275 * Log a message with debug log level.
276 *
277 * @param message The message to log
278 */
279 public final void trace(Object message) {
280 if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) {
281 log(SimpleLog.LOG_LEVEL_TRACE, message, null);
282 }
283 }
284
285 /**
286 * Log an error with debug log level.
287 *
288 * @param message The message to log
289 * @param t The error cause, if any
290 */
291 public final void trace(Object message, Throwable t) {
292 if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) {
293 log(SimpleLog.LOG_LEVEL_TRACE, message, t);
294 }
295 }
296
297 /**
298 * Log a message with info log level.
299 *
300 * @param message The message to log
301 */
302 public final void info(Object message) {
303 if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) {
304 log(SimpleLog.LOG_LEVEL_INFO,message,null);
305 }
306 }
307
308 /**
309 * Log an error with info log level.
310 *
311 * @param message The message to log
312 * @param t The error cause, if any
313 */
314 public final void info(Object message, Throwable t) {
315 if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) {
316 log(SimpleLog.LOG_LEVEL_INFO, message, t);
317 }
318 }
319
320 /**
321 * Log a message with warn log level.
322 *
323 * @param message The message to log
324 */
325 public final void warn(Object message) {
326 if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) {
327 log(SimpleLog.LOG_LEVEL_WARN, message, null);
328 }
329 }
330
331 /**
332 * Log an error with warn log level.
333 *
334 * @param message The message to log
335 * @param t The error cause, if any
336 */
337 public final void warn(Object message, Throwable t) {
338 if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) {
339 log(SimpleLog.LOG_LEVEL_WARN, message, t);
340 }
341 }
342
343 /**
344 * Log a message with error log level.
345 *
346 * @param message The message to log
347 */
348 public final void error(Object message) {
349 if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) {
350 log(SimpleLog.LOG_LEVEL_ERROR, message, null);
351 }
352 }
353
354 /**
355 * Log an error with error log level.
356 *
357 * @param message The message to log
358 * @param t The error cause, if any
359 */
360 public final void error(Object message, Throwable t) {
361 if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) {
362 log(SimpleLog.LOG_LEVEL_ERROR, message, t);
363 }
364 }
365
366 /**
367 * Log a message with fatal log level.
368 *
369 * @param message The message to log
370 */
371 public final void fatal(Object message) {
372 if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) {
373 log(SimpleLog.LOG_LEVEL_FATAL, message, null);
374 }
375 }
376
377 /**
378 * Log an error with fatal log level.
379 *
380 * @param message The message to log
381 * @param t The error cause, if any
382 */
383 public final void fatal(Object message, Throwable t) {
384 if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) {
385 log(SimpleLog.LOG_LEVEL_FATAL, message, t);
386 }
387 }
388
389 /**
390 * <p> Are debug messages currently enabled? </p>
391 *
392 * <p> This allows expensive operations such as <code>String</code>
393 * concatenation to be avoided when the message will be ignored by the
394 * logger. </p>
395 *
396 * @return true, if the {@link SimpleLog#LOG_LEVEL_DEBUG} is enabled, false otherwise
397 */
398 public final boolean isDebugEnabled() {
399 return isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG);
400 }
401
402 /**
403 * <p> Are error messages currently enabled? </p>
404 *
405 * <p> This allows expensive operations such as <code>String</code>
406 * concatenation to be avoided when the message will be ignored by the
407 * logger. </p>
408 *
409 * @return true, if the {@link SimpleLog#LOG_LEVEL_ERROR} is enabled, false otherwise
410 */
411 public final boolean isErrorEnabled() {
412 return isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR);
413 }
414
415 /**
416 * <p> Are fatal messages currently enabled? </p>
417 *
418 * <p> This allows expensive operations such as <code>String</code>
419 * concatenation to be avoided when the message will be ignored by the
420 * logger. </p>
421 *
422 * @return true, if the {@link SimpleLog#LOG_LEVEL_FATAL} is enabled, false otherwise
423 */
424 public final boolean isFatalEnabled() {
425 return isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL);
426 }
427
428 /**
429 * <p> Are info messages currently enabled? </p>
430 *
431 * <p> This allows expensive operations such as <code>String</code>
432 * concatenation to be avoided when the message will be ignored by the
433 * logger. </p>
434 *
435 * @return true, if the {@link SimpleLog#LOG_LEVEL_INFO} is enabled, false otherwise
436 */
437 public final boolean isInfoEnabled() {
438 return isLevelEnabled(SimpleLog.LOG_LEVEL_INFO);
439 }
440
441 /**
442 * <p> Are trace messages currently enabled? </p>
443 *
444 * <p> This allows expensive operations such as <code>String</code>
445 * concatenation to be avoided when the message will be ignored by the
446 * logger. </p>
447 *
448 * @return true, if the {@link SimpleLog#LOG_LEVEL_TRACE} is enabled, false otherwise
449 */
450 public final boolean isTraceEnabled() {
451 return isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE);
452 }
453
454 /**
455 * <p> Are warn messages currently enabled? </p>
456 *
457 * <p> This allows expensive operations such as <code>String</code>
458 * concatenation to be avoided when the message will be ignored by the
459 * logger. </p>
460 *
461 * @return true, if the {@link SimpleLog#LOG_LEVEL_WARN} is enabled, false otherwise
462 */
463 public final boolean isWarnEnabled() {
464 return isLevelEnabled(SimpleLog.LOG_LEVEL_WARN);
465 }
466
467 }