Hi,

After my previous posts concerning Java: Log4j Concepts and Explanations and Java: Log4j in practice, I would expose a solution to overwrite the file path on runtime.

Libraries needed : commons-lang3-3.1.jar, commons-logging-1.1.1.jar and log4j-1.2.15.jar.

MainApp.java

package com.ho.log4j.test2;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator;

public class MainApp {

	private final static String LOG4J_FILENAME = "log4jInjector.properties";
	private final static String BUSINESS_LOG_FILE_KEY = "BUSINESS_LOG_FILE";
	private final static String TECHNICAL_LOG_FILE_KEY = "TECHNICAL_LOG_FILE";
	private static LogUtil logUtil = null;

	/**
     * Main
     * @param args
     */
    public static void main(String[] args){

        try{
            if(args==null || args.length==0){
                System.out.println("Usage : MainApp configfilepath");
                System.out.println("configfilepath : path to the configuration file config.properties containing the parameters");
                return;
            }

            Properties prop = new Properties();
            {
                InputStream input;
                String filename = args[0];
                System.out.println("********Loading of configuration file named "+filename+"********");
                input = new FileInputStream(filename);
                prop.load(input);
            }

            {
                InputStream log4ConfigStream = null;
                try {
                    log4ConfigStream = LogUtil.class.getResourceAsStream(LOG4J_FILENAME);
                    Properties props = new Properties();
                    props.load(log4ConfigStream);
                    props.setProperty("log4j.appender.BUSINESSLOGFILE.File", prop.getProperty(BUSINESS_LOG_FILE_KEY));
                    props.setProperty("log4j.appender.TECHNICALLOGFILE.File", prop.getProperty(TECHNICAL_LOG_FILE_KEY));
                    LogManager.resetConfiguration();
                    PropertyConfigurator.configure(props);
                } catch (Exception ex) {
                    ex.printStackTrace(System.out);
                    throw new RuntimeException("Error in the LogUtil.init() method...");
                } finally {
                    if (log4ConfigStream != null) {
                        try {
                            log4ConfigStream.close();
                        } catch (Exception ex) {
                            ex.printStackTrace(System.out);
                        }
                    }
                }
            }

            // Initialisation du logger
            logUtil = new LogUtil();

            logUtil.log("************************** log trace 1 ************************");
            logUtil.logError("******** log trace 2 ERROR ********");

        }catch(Throwable th){
        	if(logUtil !=null){
        		logUtil.logException(th);
        	}else{
        		th.printStackTrace();
        	}
        }
    }
}

Config.properties

BUSINESS_LOG_FILE=D\:\\...\\... \\data\\results\\InjectorBusiness.log
TECHNICAL_LOG_FILE=D\:\\...\\...\\data\\results\\InjectorTechnical.log

LogUtil.java

package com.ho.log4j.test2;

import org.apache.commons.lang3.exception.ExceptionUtils;

public class LogUtil {


    private org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogUtil.class);

    // ----------------------------------------------------------- CONSTRUCTOR
    public LogUtil() { }

    // ------------------------------------------------------ PUBLIC FUNCTIONS
    public void log(String str){
        if(str !=null){
            log.info(str);
        }else{
            log.info("");
        }
    }

    public void logException(Throwable ex){
        Throwable th = ExceptionUtils.getRootCause(ex);
        if(th == null){
            log.error(ex);
        }else{
            log.error(th);
        }
    }

    public void logError(String str){
        if(str !=null){
            log.error(str);
        }else{
            log.error("");
        }
    }
}

log4jInjector.properties

log4j.rootCategory=ALL,CONSOLE,TECHNICALLOGFILE

log4j.logger.com.ho.log4j.test2.LogUtil=INFO,BUSINESSLOGFILE

#------------------- CONSOLE --------------------------
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %m%n
log4j.appender.CONSOLE.Threshold=INFO

#------------------- FILE --------------------------
log4j.appender.TECHNICALLOGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.TECHNICALLOGFILE.File=injectortech.log
log4j.appender.TECHNICALLOGFILE.MaxFileSize=30MB
log4j.appender.TECHNICALLOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.TECHNICALLOGFILE.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c - %m%n
log4j.appender.TECHNICALLOGFILE.Threshold=ALL

#------------------- BUSINESSLOGFILE --------------------------
log4j.appender.BUSINESSLOGFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.BUSINESSLOGFILE.File=${catalina.base}/logs/Injector.log
log4j.appender.BUSINESSLOGFILE.File=injector.log
log4j.appender.BUSINESSLOGFILE.DatePattern='.'yyy-MM-dd-HH
log4j.appender.BUSINESSLOGFILE.MaxFileSize=30MB
log4j.appender.BUSINESSLOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.BUSINESSLOGFILE.Threshold=ALL
log4j.appender.BUSINESSLOGFILE.Append=true
log4j.appender.BUSINESSLOGFILE.layout.ConversionPattern=%-d{MMM dd HH:mm:ss} %-5p %c %M %m%n

Execute the MainApp class with the following program argument “C:\…\test_log4j\src\com\ho\log4j\test2\Config.properties”.

So the resuts would be the generation of log files named:
InjectorBusiness.log:

oct. 04 00:06:32 INFO com.ho.log4j.test2.LogUtil log ************************** log trace 1 ************************
oct. 04 00:06:32 ERROR com.ho.log4j.test2.LogUtil logError ******** log trace 2 ERROR ********

…and InjectorTechnical.log:

00:06:32,074 INFO [main] com.ho.log4j.test2.LogUtil - ************************** log trace 1 ************************
00:06:32,078 ERROR [main] com.ho.log4j.test2.LogUtil - ******** log trace 2 ERROR ********

That’s all!!

Huseyin OZVEREN