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    }