Log4j给不同的logger动态设立不同的配置

Log4j给不同的logger动态设置不同的配置

      现在有log4j.properties 配置文件,假如现在需要动态改变 logger 的配置,动态地输出到不同的目录,则可以按如下代码操作:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import org.apache.log4j.Hierarchy;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.RootLogger;

public class TestLog4j {

	public static void main(String[] args) {

		PropertyConfigurator pc = new PropertyConfigurator();
		Properties p = new Properties();

		LoggerRepository lr1 = null;
		LoggerRepository lr2 = null;

		Logger logger1 = new RootLogger(Level.ALL);
		Logger logger2 = new RootLogger(Level.ALL);

		try {
			//p.load(new FileInputStream("log4j.properties"));
			p.load(TestLog4j.class.getResourceAsStream("log4j.properties"));
			
			lr1 = new Hierarchy(logger1);
			lr2 = new Hierarchy(logger2);

			p.setProperty("log4j.appender.D.File", "D:/test1.log");
			pc.doConfigure(p, lr1);

			p.setProperty("log4j.appender.D.File", "D:/test2.log");
			pc.doConfigure(p, lr2);

			logger1.info("hello world logger1");
			logger2.info("hello world logger2");

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

 property 文件如下:

### set log levels ###
log4j.rootLogger = debug , stdout , D

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D:/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### 保存异常信息到单独文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D:/logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

 

执行以后可以动态生成:D:/test1.log 和 D:/test2.log.