
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