Some code I'm writing runs in two different environments.  In one
environment, I'm using log4j. In the other environment, the code calls that
environment's logging system.  Therefore, I need to subclass log4j's Logger
so that I can implement an interface required by the other logging system.
I have a solution working with one big drawback.  The %F and %L specfied in
the Appender's Conversion Pattern always return the same file and line
number of my log4j subclass, not the class that originated the logging
event.

Is there a better solution to my inheritance dilemma? Or is there some way
to pass log4j the file and line number arguments?

Thanks!

/* The Log interface is specified by the non-log4j environment.  The methods
have the same name as log4j. */
public class LoggerX extends Logger implements Log {
    /**
     * @param arg0
     */
    public LoggerX( String arg0 ) {
        super( arg0 );
        parent = super.getLogger( arg0 );
    }

    static int       logEnvironment = 0;

    final static int ENVIRONMENT_1            = 0;

    final static int ENVIRONMENT_2       = 1;

    // the log4j logger returned by super.getLogger
    Logger           parent         = null;

    public  static LoggerX getLoggerForEnv( String arg0 ) {
        switch ( logEnvironment ) {
            case ENVIRONMENT_1 :
                return ( LoggerX ) OtherEnvironment.getLogger( );

            case ENVIRONMENT_2 :
                System.out.println( "creating new ENVIRONMENT_2 logger" );
                return new LoggerX( arg0 );

            default :
                System.out.println( "************ UNKNOWN LOGGER TYPE: " +
logEnvironment + " *************" );
        }
        return null;
    }

   /* this call produces the same file and line number regardless of the
caller.  I know why, but I don't have a solution.  */
    public boolean info(String arg0) {
        parent.info( arg0);
    }

   public static void setEnvironmentTo1() {
        logEnvironment = ENVIRONMENT_1;
    }

    public static void setEnvironmentTo2() {
        logEnvironment = ENVIRONMENT_2;
    }
}

Reply via email to