All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.plexus.logging.log4j.Log4JLoggerManager Maven / Gradle / Ivy

The newest version!
package org.codehaus.plexus.logging.log4j;

import org.apache.log4j.PropertyConfigurator;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;

import java.io.File;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;

/**
 * Logger Manager for Log4j logging system which is configurable
 * by plexus services.
 *
 * A simple configuration:
 * 
 * 
 * 
 *  <configuration>
 *    <threshold>DEBUG</threshold>
 *    <default-appender>file</default-appender>
 *    <appenders>
 *      <appender>
 *        <id>file</id>
 *        <threshold>INFO</threshold>
 *        <type>org.apache.log4j.FileAppender</type>
 *        <conversion-pattern>%-4r [%t] %-5p %c %x - %m%n</conversion-pattern>
 * 
 *        <properties>
 *          <property>
 *            <key>file</key>
 *            <value>${plexus.home}/logs/plexus.log</value>
 *          </property>
 *          <property>
 *            <key>append</key>
 *            <value>true</value>
 *          </property>
 *        </properties>
 *      </appender>
 * 
 *      <appender>
 *        <id>console</id>
 *        <type>org.apache.log4j.ConsoleAppender</type>
 *        <conversion-pattern>%-4r [%t] %-5p %c %x - %m%n</conversion-pattern>
 *      </appender>
 * 
 *      <appender>
 *        <id>rolling</id>
 *        <threshold>DEBUG</threshold>
 *        <type>org.apache.log4j.RollingFileAppender</type>
 *        <conversion-pattern>%-4r [%t] %-5p %c %x - %m%n</conversion-pattern>
 * 
 *        <properties>
 *          <property>
 *            <key>file</key>
 *            <value>${plexus.home}/logs/plexus-rolling.log</value>
 *          </property>
 *          <property>
 *            <key>append</key>
 *            <value>true</value>
 *          </property>
 *          <property>
 *            <key>maxBackupIndex</key>
 *            <value>10</value>
 *          </property>
 *          <property>
 *            <key>maxFileSize</key>
 *            <value>20</value>
 *          </property>
 *        </properties>
 *      </appender>
 *    </appenders>
 *  </configuration>
 *  
 * 
* @author Michal Maczka * @author Trygve Laugstøl * @version $Id: Log4JLoggerManager.java 4173 2006-09-20 21:21:47Z joakime $ */ public class Log4JLoggerManager extends AbstractLog4JLoggerManager implements Startable { /** * The threshold. * * @default DEBUG * @todo this fields resides in the class which is other module ... * what shoud we do in such cases? */ //private String threshold; /** * The default appender id. * * @todo it is not that obvious what's deafult appender * as deafult appender is null and we can change it * "anonymous" under certain circumstances. * That's probably good example which highlights * what can be supported by CDC. * * * @default null/anonymous * */ private String defaultAppender; /** * @default */ private List appenders; /** * @default */ private List levels; // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- /** Log4j properties used to init log4j. */ private Properties log4JProperties; // ---------------------------------------------------------------------- // Lifecycle // ---------------------------------------------------------------------- public void initialize() { super.initialize(); log4JProperties = new Properties(); Map configuredAppenders = new HashMap(); if ( appenders == null || appenders.size() == 0 ) { if ( defaultAppender != null ) { throw new IllegalArgumentException( "A default appender cant be specified without any appenders configured." ); } defaultAppender = "anonymous"; log4JProperties.setProperty( "log4j.appender.anonymous", "org.apache.log4j.ConsoleAppender" ); log4JProperties.setProperty( "log4j.appender.anonymous.threshold", getThresholdAsString() ); log4JProperties.setProperty( "log4j.appender.anonymous.layout", "org.apache.log4j.PatternLayout" ); log4JProperties.setProperty( "log4j.appender.anonymous.layout.conversionPattern", "%-4r [%t] %-5p %c %x - %m%n" ); } else { for ( int i = 0; i < appenders.size(); i++ ) { Appender appender = (Appender) appenders.get( i ); String id = appender.getId(); if ( configuredAppenders.containsKey( id ) ) { throw new IllegalArgumentException( "There already exists a appender with the id '" + id + "'." ); } if ( id == null ) { throw new IllegalArgumentException( "The appender must have a id." ); } if ( appender.getThreshold() == null ) { appender.setThreshold( getThresholdAsString() ); } if ( appender.getConversionPattern() == null ) { throw new IllegalArgumentException( "The appender must have a conversion pattern." ); } if ( appender.getType() == null ) { throw new IllegalArgumentException( "The appender must have a type." ); } try { Class.forName( appender.getType() ); } catch ( ClassNotFoundException ex ) { IllegalArgumentException e = new IllegalArgumentException( "Could not find the appender class: " + appender.getType() ); e.initCause( ex ); throw e; } catch ( LinkageError ex ) { IllegalArgumentException e = new IllegalArgumentException( "Could load the appender class: " + appender.getType() ); e.initCause( ex ); throw e; } String base = "log4j.appender." + id; log4JProperties.setProperty( base, appender.getType() ); log4JProperties.setProperty( base + ".threshold", appender.getThreshold() ); log4JProperties.setProperty( base + ".layout", "org.apache.log4j.PatternLayout" ); log4JProperties.setProperty( base + ".layout.conversionPattern", appender.getConversionPattern() ); Enumeration e = appender.getProperties().keys(); while ( e.hasMoreElements() ) { String key = e.nextElement().toString(); log4JProperties.setProperty( base + "." + key, appender.getProperty( key ) ); if ( "file".equals( key ) ) { File logFile = new File( appender.getProperty( key ) ); File logDir = logFile.getParentFile(); if ( ! logDir.exists() ) { logDir.mkdirs(); } } } configuredAppenders.put( id, appender ); } if ( defaultAppender == null ) { if ( configuredAppenders.size() == 1 ) { defaultAppender = ((Appender) appenders.get( 0 )).getId(); } else { throw new IllegalArgumentException( "A default appender must be specified when having several appenders." ); } } else { StringTokenizer tokenizer = new StringTokenizer( defaultAppender, "," ); while ( tokenizer.hasMoreTokens() ) { String appender = tokenizer.nextToken(); if ( !configuredAppenders.containsKey( appender ) ) { throw new IllegalArgumentException( "Could not find the default appender: '" + defaultAppender + "'." ); } } } } if ( levels != null && levels.size() > 0 ) { for ( Iterator it = levels.iterator(); it.hasNext(); ) { Level level = (Level) it.next(); log4JProperties.put( "log4j.logger." + level.getHierarchy(), level.getLevel() + level.getAppenders() ); } } if ( getThresholdAsString() == null ) { throw new IllegalArgumentException( "INTERNAL ERROR: The threshold must be set." ); } if ( defaultAppender == null ) { throw new IllegalArgumentException( "INTERNAL ERROR: The default appender must be set." ); } log4JProperties.setProperty( "log4j.rootLogger", getThresholdAsString() + "," + defaultAppender ); } public void start() throws StartingException { PropertyConfigurator.configure( log4JProperties ); } public void stop() throws StoppingException { } // useful for testing public Properties getLog4JProperties() { return log4JProperties; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy