001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/framework/log/Log4JLogger.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2006 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53177 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    package org.deegree.framework.log;
045    
046    import java.net.URL;
047    
048    import org.apache.log4j.BasicConfigurator;
049    import org.apache.log4j.Level;
050    import org.apache.log4j.Logger;
051    import org.apache.log4j.Priority;
052    import org.apache.log4j.PropertyConfigurator;
053    import org.deegree.framework.util.StringTools;
054    
055    /**
056     * Log service provided by log4j. The log environment is fully configurable using a configuration
057     * file. The configuration file name is <code>log4j.properties</code>. The default location of
058     * the log file is the system property <code>user.home</code>.
059     * 
060     * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </A>
061     * @author last edited by: $Author: apoth $
062     * @version $Revision: 7749 $, $Date: 2007-07-10 19:15:47 +0200 (Di, 10 Jul 2007) $
063     * 
064     * @see <a href="http://jakarta.apache.org/log4j">Log4J home </a>
065     */
066    final class Log4JLogger extends LoggerService {
067    
068        private static String PROP_FILE = "log4j.properties";
069    
070        private Logger log;
071    
072        private String className;
073    
074        Log4JLogger() {
075            super();
076            this.bindClass( Log4JLogger.class );
077    
078            URL urlToLog4jProps = Log4JLogger.class.getResource( "/" + PROP_FILE );
079            if ( urlToLog4jProps == null ) {
080                urlToLog4jProps = Log4JLogger.class.getResource( PROP_FILE );
081            }
082            if ( urlToLog4jProps != null ) {
083                PropertyConfigurator.configure( urlToLog4jProps );
084                this.logDebug( "Log4J: found log4j.properties, initialized the Logger with configuration found in file "
085                               + urlToLog4jProps );
086            } else {
087                // Set up a simple configuration that logs on the console.
088                BasicConfigurator.configure();
089                this.logDebug( "Log4J: No log4j.properties found, initialized Log4J with a BasicConfiguration." );
090            }
091        }
092    
093        public void bindClass( String name ) {
094            log = Logger.getLogger( name );
095            String[] ss = name.split( "\\." );
096            this.className = ss[ss.length - 1];
097        }
098    
099        public void bindClass( Class clazz ) {
100            this.bindClass( clazz.getName() );
101        }
102    
103        @Override
104        public void logDebug( String message ) {
105            if ( getLevel() == LOG_DEBUG ) {
106                message = StringTools.concat( 500, '[', this.className, "] ", message );
107                log.debug( message );
108            }
109        }
110    
111        @Override
112        public void logDebug( String message, Throwable e ) {
113            if ( getLevel() == LOG_DEBUG ) {
114                message = StringTools.concat( 500, '[', this.className, "] ", message );
115                log.debug( message, e );
116            }
117        }
118    
119        public void logDebug( String message, Object tracableObject ) {
120            if ( getLevel() == LOG_DEBUG ) {
121                message = StringTools.concat( 500, '[', this.className, "] ", message, ": ", tracableObject );
122                logDebug( message );
123            }
124        }
125    
126        @Override
127        public void logInfo( String message, Throwable e ) {
128            log.info( message, e );
129        }
130    
131        @Override
132        public void logWarning( String message, Throwable e ) {
133            message = StringTools.concat( 500, '[', this.className, "] ", message );
134            log.warn( message, e );
135        }
136    
137        public void logError( String message, Throwable e ) {
138            message = StringTools.concat( 500, '[', this.className, "] ", message );
139            log.error( message, e );
140        }
141    
142        @Override
143        public void logInfo( String message ) {
144            log.info( message );
145        }
146    
147        @Override
148        public void logWarning( String message ) {
149            message = StringTools.concat( 500, '[', this.className, "] ", message );
150            log.warn( message );
151        }
152    
153        public void logError( String message ) {
154            message = StringTools.concat( 500, '[', this.className, "] ", message );
155            log.error( message );
156        }
157    
158        public void logInfo( String message, Object tracableObject ) {
159            log.info( message + ": " + tracableObject );
160        }
161    
162        public void log( int priority, String message, Throwable ex ) {
163            message = StringTools.concat( 500, '[', this.className, "] ", message );
164            log.log( Level.DEBUG, message, ex );
165        }
166    
167        public void log( int priority, String message, Object source, Throwable ex ) {
168            message = StringTools.concat( 500, '[', this.className, "] ", message );
169            log.log( message, Level.DEBUG, source, ex );
170        }
171    
172        @Override
173        public String toString() {
174            return ( "Logging Class: " + this.log.getClass().getName() );
175        }
176    
177        public int getLevel() {
178            return this.getInternalLevel( this.log.getEffectiveLevel() );
179        }
180    
181        public void setLevel( int level ) {
182            this.log.setLevel( this.getLog4JLevel( level ) );
183        }
184    
185        private Level getLog4JLevel( int logLevel ) {
186            Level log4jlevel;
187            switch ( logLevel ) {
188            case ILogger.LOG_DEBUG:
189                log4jlevel = Level.DEBUG;
190                break;
191            case ILogger.LOG_INFO:
192                log4jlevel = Level.INFO;
193                break;
194            case ILogger.LOG_WARNING:
195                log4jlevel = Level.WARN;
196                break;
197            case ILogger.LOG_ERROR:
198                log4jlevel = Level.ERROR;
199                break;
200            default:
201                log4jlevel = Level.INFO;
202                break;
203            }
204            return log4jlevel;
205        }
206    
207        private int getInternalLevel( Level log4JLevel ) {
208            int intloglevel = ILogger.LOG_INFO;
209            if ( log4JLevel != null ) {
210                switch ( log4JLevel.toInt() ) {
211                case Priority.DEBUG_INT:
212                    intloglevel = ILogger.LOG_DEBUG;
213                    break;
214                case Priority.INFO_INT:
215                    intloglevel = ILogger.LOG_INFO;
216                    break;
217                case Priority.WARN_INT:
218                    intloglevel = ILogger.LOG_WARNING;
219                    break;
220                case Priority.FATAL_INT:
221                case Priority.ERROR_INT:
222                    intloglevel = ILogger.LOG_ERROR;
223                    break;
224                default:
225                    intloglevel = ILogger.LOG_INFO;
226                    break;
227                }
228            }
229            return intloglevel;
230        }
231    
232        public boolean isDebug() {
233            return log.isDebugEnabled();
234        }
235    }