Berin, Berin Loritsch wrote:
you would also need excalibur-logger to get the logger repository functionality via the LoggerManager.The framework part, weighing in at a mere 80k uncompressed isn't very heavy. In fact it is fairly minimalistic. I agree with the problem of *perception*
actually, what are the reasons to keep framework.logger and excalibur.logger separate (at least the LoggerManager
and the its implementations)?
Could they be united in Avalon5?
what if a static access method was added to LoggerManager implementations to get a singleton instance?Keep in mind that COP (i.e. Avalon environment) has a differentyes - and I appreciate them. but if we want the Avalon
set of constraints than traditional OOP. Basically, COP forces
you to operate within a certain subset of OOP which simplifies
a number of design decisions you have to make. It also lends
the benefit of VLC (Very Low Coupling) between implementations
of components.
framework and
logger to
be adopted more widely - we also need to consider that COP is not the
only way
or the dominant way.
The point I'm trying to make is if and how the two can be reconciled .
In a future version of Avalon, it is something to look at. The risks of a rogue component successfully cracking a container's security through logging is minimal.
Say, if one wanted to use Log4J via the Avalon Logger framework - without any autodiscovery - would would simply write
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.excalibur.logger.Log4JLoggerManager;
public class MyClass {
private static Logger logger = Log4JLoggerManager.getInstance().getDefaultLogger();
}
Effectively, that would allow OOP-style development with Avalon and "prepare the ground" for COP if and when they decided to?
One might introduce some mechanism to disable the singleton access when the component was deployed in a container.
BTW, I've noticed that the framework.logger.Log4JLogger still used log4j 1.1.x.
Since 1.2.x has deprecated Category and Priority and these are going to disappear in the next few months
I've updated the Log4JLogger to use the non deprecated classes/methods.
Being a wrapper class it should have any effect elsewhere nor should it matter for backward compatibility. Also I've noticed that other parts of Avalon (eg. Excalibur) use log4j 1.2 so it would better to be consistency.
A patch is attached. And lib has to updated accordingly to use any log4j-1.2.x.jar
Cheers,
Mauro
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 1997-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software * itself, if and wherever such third-party acknowledgments * normally appear. * * 4. The names "Jakarta", "Avalon", and "Apache Software Foundation" * must not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.avalon.framework.logger; /** * The default Log4J wrapper class for Logger. * * @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a> */ public final class Log4JLogger implements Logger { //underlying implementation private final org.apache.log4j.Logger m_logger; /** * Create a logger that delegates to specified Log4J logger. * * @param logger the Log4J logger to delegate to */ public Log4JLogger( final org.apache.log4j.Logger logger ) { m_logger = logger; } /** * Log a debug message. * * @param message the message */ public final void debug( final String message ) { m_logger.debug( message ); } /** * Log a debug message. * * @param message the message * @param throwable the throwable */ public final void debug( final String message, final Throwable throwable ) { m_logger.debug( message, throwable ); } /** * Determine if messages of level "debug" will be logged. * * @return true if "debug" messages will be logged */ public final boolean isDebugEnabled() { return m_logger.isDebugEnabled(); } /** * Log a info message. * * @param message the message */ public final void info( final String message ) { m_logger.info( message ); } /** * Log a info message. * * @param message the message * @param throwable the throwable */ public final void info( final String message, final Throwable throwable ) { m_logger.info( message, throwable ); } /** * Determine if messages of level "info" will be logged. * * @return true if "info" messages will be logged */ public final boolean isInfoEnabled() { return m_logger.isInfoEnabled(); } /** * Log a warn message. * * @param message the message */ public final void warn( final String message ) { m_logger.warn( message ); } /** * Log a warn message. * * @param message the message * @param throwable the throwable */ public final void warn( final String message, final Throwable throwable ) { m_logger.warn( message, throwable ); } /** * Determine if messages of level "warn" will be logged. * * @return true if "warn" messages will be logged */ public final boolean isWarnEnabled() { return m_logger.isEnabledFor( org.apache.log4j.Level.WARN ); } /** * Log a error message. * * @param message the message */ public final void error( final String message ) { m_logger.error( message ); } /** * Log a error message. * * @param message the message * @param throwable the throwable */ public final void error( final String message, final Throwable throwable ) { m_logger.error( message, throwable ); } /** * Determine if messages of level "error" will be logged. * * @return true if "error" messages will be logged */ public final boolean isErrorEnabled() { return m_logger.isEnabledFor( org.apache.log4j.Level.ERROR ); } /** * Log a fatalError message. * * @param message the message */ public final void fatalError( final String message ) { m_logger.fatal( message ); } /** * Log a fatalError message. * * @param message the message * @param throwable the throwable */ public final void fatalError( final String message, final Throwable throwable ) { m_logger.fatal( message, throwable ); } /** * Determine if messages of level "fatalError" will be logged. * * @return true if "fatalError" messages will be logged */ public final boolean isFatalErrorEnabled() { return m_logger.isEnabledFor( org.apache.log4j.Level.FATAL ); } /** * Create a new child logger. * The name of the child logger is [current-loggers-name].[passed-in-name] * Throws <code>IllegalArgumentException</code> if name has an empty element name * * @param name the subname of this logger * @return the new logger */ public final Logger getChildLogger( final String name ) { return new Log4JLogger( org.apache.log4j.Logger.getLogger( m_logger.getName() + "." + name ) ); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
