Coverage Report - org.apache.ojb.broker.util.logging.LoggingConfiguration
 
Classes in this File Line Coverage Branch Coverage Complexity
LoggingConfiguration
N/A
N/A
3.5
 
 1  
 package org.apache.ojb.broker.util.logging;
 2  
 
 3  
 /* Copyright 2002-2005 The Apache Software Foundation
 4  
  *
 5  
  * Licensed under the Apache License, Version 2.0 (the "License");
 6  
  * you may not use this file except in compliance with the License.
 7  
  * You may obtain a copy of the License at
 8  
  *
 9  
  *     http://www.apache.org/licenses/LICENSE-2.0
 10  
  *
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 
 18  
 import java.io.InputStream;
 19  
 import java.io.File;
 20  
 import java.util.Properties;
 21  
 import java.net.URL;
 22  
 
 23  
 import org.apache.ojb.broker.util.ClassHelper;
 24  
 import org.apache.ojb.broker.util.configuration.impl.ConfigurationAbstractImpl;
 25  
 import org.apache.commons.lang.SystemUtils;
 26  
 
 27  
 /**
 28  
  * Provides the configuration for the logging. Note that this is separated from the OJB
 29  
  * configuration.
 30  
  * 
 31  
  * @version $Id: LoggingConfiguration.java,v 1.1 2007-08-24 22:17:32 ewestfal Exp $
 32  
  */
 33  
 public class LoggingConfiguration extends ConfigurationAbstractImpl
 34  
 {
 35  
     /** The commons-logging property denoting which log to use. This property
 36  
      *  is repeated here to avoid making this class dependent upon commons-logging */
 37  
     public static final String PROPERTY_COMMONS_LOGGING_LOG = "org.apache.commons.logging.Log";
 38  
     /** The commons-logging property denoting which log factory to use. This property
 39  
      *  is repeated here to avoid making this class dependent upon commons-logging */
 40  
     public static final String PROPERTY_COMMONS_LOGGING_LOGFACTORY = "org.apache.commons.logging.LogFactory";
 41  
     /** The property denoting the OJB logger class */
 42  
     public static final String PROPERTY_OJB_LOGGERCLASS      = "org.apache.ojb.broker.util.logging.Logger.class";
 43  
     /** The property denoting the config file for the OJB logger class */
 44  
     public static final String PROPERTY_OJB_LOGGERCONFIGFILE = "org.apache.ojb.broker.util.logging.Logger.configFile";
 45  
     /** Default filename of the OJB logging properties file */
 46  
     public static final String OJB_LOGGING_PROPERTIES_FILE = "OJB-logging.properties";
 47  
     /** Default log level */
 48  
     public static final String OJB_DEFAULT_LOG_LEVEL = "WARN";
 49  
     /** Default boot log level */
 50  
     public static final String OJB_DEFAULT_BOOT_LOG_LEVEL = "INFO";
 51  
 
 52  
     /** The logger class */
 53  
     private Class  _loggerClass;
 54  
     /** The config file for the logger */
 55  
     private String _loggerConfigFile;
 56  
 
 57  
     /**
 58  
      * Creates a new logging configuration object which automatically initializes itself.
 59  
      */
 60  
     public LoggingConfiguration()
 61  
     {
 62  
         super();
 63  
     }
 64  
 
 65  
     /* (non-Javadoc)
 66  
      * @see org.apache.ojb.broker.util.configuration.impl.ConfigurationAbstractImpl#load()
 67  
      */
 68  
     protected void load()
 69  
     {
 70  
         Logger bootLogger = LoggerFactory.getBootLogger();
 71  
 
 72  
         // first we check whether the system property
 73  
         //   org.apache.ojb.broker.util.logging.Logger
 74  
         // is set (or its alias LoggerClass which is deprecated)
 75  
         ClassLoader contextLoader   = ClassHelper.getClassLoader();
 76  
         String      loggerClassName;
 77  
 
 78  
         _loggerClass      = null;
 79  
         properties        = new Properties();
 80  
         loggerClassName   = getLoggerClass(System.getProperties());
 81  
         _loggerConfigFile = getLoggerConfigFile(System.getProperties());
 82  
 
 83  
         InputStream ojbLogPropFile;
 84  
         if (loggerClassName == null)
 85  
         {
 86  
             // now we're trying to load the OJB-logging.properties file
 87  
             String ojbLogPropFilePath = System.getProperty(OJB_LOGGING_PROPERTIES_FILE, OJB_LOGGING_PROPERTIES_FILE);
 88  
             try
 89  
             {
 90  
                 URL ojbLoggingURL = ClassHelper.getResource(ojbLogPropFilePath);
 91  
                 if (ojbLoggingURL == null)
 92  
                 {
 93  
                     ojbLoggingURL = (new File(ojbLogPropFilePath)).toURL();
 94  
                 }
 95  
                 ojbLogPropFile = ojbLoggingURL.openStream();
 96  
                 try
 97  
                 {
 98  
                     bootLogger.info("Found logging properties file: " + ojbLogPropFilePath);
 99  
                     properties.load(ojbLogPropFile);
 100  
                     _loggerConfigFile = getLoggerConfigFile(properties);
 101  
                     loggerClassName = getLoggerClass(properties);
 102  
                 }
 103  
                 finally
 104  
                 {
 105  
                     ojbLogPropFile.close();
 106  
                 }
 107  
             }
 108  
             catch (Exception ex)
 109  
             {
 110  
                 if(loggerClassName == null)
 111  
                 {
 112  
                     bootLogger.warn("Can't read logging properties file using path '" + ojbLogPropFilePath
 113  
                             + "', message is: " + SystemUtils.LINE_SEPARATOR + ex.getMessage()
 114  
                             + SystemUtils.LINE_SEPARATOR + "Will try to load logging properties from OJB.properties file");
 115  
                 }
 116  
                 else
 117  
                 {
 118  
                     bootLogger.info("Problems while closing resources for path '" + ojbLogPropFilePath
 119  
                             + "', message is: " + SystemUtils.LINE_SEPARATOR + ex.getMessage(), ex);
 120  
                 }
 121  
             }
 122  
         }
 123  
         if (loggerClassName == null)
 124  
         {
 125  
             // deprecated: load the OJB.properties file
 126  
             // this is not good because we have all OJB properties in this config
 127  
             String ojbPropFile = System.getProperty("OJB.properties", "OJB.properties");
 128  
 
 129  
             try
 130  
             {
 131  
                 ojbLogPropFile = contextLoader.getResourceAsStream(ojbPropFile);
 132  
                 if (ojbLogPropFile != null)
 133  
                 {
 134  
                     try
 135  
                     {
 136  
                         properties.load(ojbLogPropFile);
 137  
                         loggerClassName   = getLoggerClass(properties);
 138  
                         _loggerConfigFile = getLoggerConfigFile(properties);
 139  
                         if (loggerClassName != null)
 140  
                         {
 141  
                             // deprecation warning for after 1.0
 142  
                             bootLogger.warn("Please use a separate '"+OJB_LOGGING_PROPERTIES_FILE+"' file to specify your logging settings");
 143  
                         }
 144  
                     }
 145  
                     finally
 146  
                     {
 147  
                         ojbLogPropFile.close();
 148  
                     }
 149  
                 }
 150  
             }
 151  
             catch (Exception ex)
 152  
             {}
 153  
         }
 154  
         if (loggerClassName != null)
 155  
         {
 156  
             try
 157  
             {
 158  
                 _loggerClass = ClassHelper.getClass(loggerClassName);
 159  
                 bootLogger.info("Logging: Found logger class '" + loggerClassName);
 160  
             }
 161  
             catch (ClassNotFoundException ex)
 162  
             {
 163  
                 _loggerClass = PoorMansLoggerImpl.class;
 164  
                 bootLogger.warn("Could not load logger class "+loggerClassName+", defaulting to "+_loggerClass.getName(), ex);
 165  
             }
 166  
         }
 167  
         else
 168  
         {
 169  
             // still no logger configured - lets check whether commons-logging is configured
 170  
             if ((System.getProperty(PROPERTY_COMMONS_LOGGING_LOG) != null) ||
 171  
                 (System.getProperty(PROPERTY_COMMONS_LOGGING_LOGFACTORY) != null))
 172  
             {
 173  
                 // yep, so use commons-logging
 174  
                 _loggerClass = CommonsLoggerImpl.class;
 175  
                 bootLogger.info("Logging: Found commons logging properties, use " + _loggerClass);
 176  
             }
 177  
             else
 178  
             {
 179  
                 // but perhaps there is a log4j.properties file ?
 180  
                 try
 181  
                 {
 182  
                     ojbLogPropFile = contextLoader.getResourceAsStream("log4j.properties");
 183  
                     if (ojbLogPropFile != null)
 184  
                     {
 185  
                         // yep, so use log4j
 186  
                         _loggerClass      = Log4jLoggerImpl.class;
 187  
                         _loggerConfigFile = "log4j.properties";
 188  
                         bootLogger.info("Logging: Found 'log4j.properties' file, use " + _loggerClass);
 189  
                         ojbLogPropFile.close();
 190  
                     }
 191  
                 }
 192  
                 catch (Exception ex)
 193  
                 {}
 194  
                 if (_loggerClass == null)
 195  
                 {
 196  
                     // or a commons-logging.properties file ?
 197  
                     try
 198  
                     {
 199  
                         ojbLogPropFile = contextLoader.getResourceAsStream("commons-logging.properties");
 200  
                         if (ojbLogPropFile != null)
 201  
                         {
 202  
                             // yep, so use commons-logging
 203  
                             _loggerClass      = CommonsLoggerImpl.class;
 204  
                             _loggerConfigFile = "commons-logging.properties";
 205  
                             bootLogger.info("Logging: Found 'commons-logging.properties' file, use " + _loggerClass);
 206  
                             ojbLogPropFile.close();
 207  
                         }
 208  
                     }
 209  
                     catch (Exception ex)
 210  
                     {}
 211  
                     if (_loggerClass == null)
 212  
                     {
 213  
                         // no, so default to poor man's logging
 214  
                         bootLogger.info("** Can't find logging configuration file, use default logger **");
 215  
                         _loggerClass = PoorMansLoggerImpl.class;
 216  
                     }
 217  
                 }
 218  
             }
 219  
         }
 220  
     }
 221  
 
 222  
     private String getLoggerClass(Properties props)
 223  
     {
 224  
         String loggerClassName = props.getProperty(PROPERTY_OJB_LOGGERCLASS);
 225  
 
 226  
         if (loggerClassName == null)
 227  
         {
 228  
             loggerClassName = props.getProperty("LoggerClass");
 229  
         }
 230  
         return loggerClassName;
 231  
     }
 232  
 
 233  
     private String getLoggerConfigFile(Properties props)
 234  
     {
 235  
         String loggerConfigFile = props.getProperty(PROPERTY_OJB_LOGGERCONFIGFILE);
 236  
 
 237  
         if (loggerConfigFile == null)
 238  
         {
 239  
             loggerConfigFile = props.getProperty("LoggerConfigFile");
 240  
         }
 241  
         return loggerConfigFile;
 242  
     }
 243  
 
 244  
     public String getLogLevel(String loggerName)
 245  
     {
 246  
         /*
 247  
         arminw:
 248  
         use ROOT.LogLevel property to define global
 249  
         default log level
 250  
         */
 251  
         return getString(loggerName + ".LogLevel", getString("ROOT.LogLevel", OJB_DEFAULT_LOG_LEVEL));
 252  
     }
 253  
 
 254  
     /* (non-Javadoc)
 255  
      * @see org.apache.ojb.broker.util.configuration.Configuration#setLogger(org.apache.ojb.broker.util.logging.Logger)
 256  
      */
 257  
     public void setLogger(Logger loggerInstance)
 258  
     {
 259  
         // ignored - only logging via the boot logger
 260  
     }
 261  
 
 262  
     /**
 263  
      * Returns the logger class.
 264  
      * 
 265  
      * @return The logger class
 266  
      */
 267  
     public Class getLoggerClass()
 268  
     {
 269  
         return _loggerClass;
 270  
     }
 271  
 
 272  
     /**
 273  
      * Returns the name of the config file for the logger.
 274  
      * 
 275  
      * @return The config file if it was configured
 276  
      */
 277  
     public String getLoggerConfigFile()
 278  
     {
 279  
         return _loggerConfigFile;
 280  
     }
 281  
 }