动态生成Log

我们在项目中可能需要一些日志文件。是动态生成的(配置文件是静态的,打印全局的log)。比如我们按照类别来收集用户输入的内容。一个类别一天一个文件。 这时候就可以用代码调用Log4j来生成

我们先自定义的LogFactory

package com.bj58.zhaoren.sou.utils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggerFactory;

/**
 * 自定义日志工厂
 * @date 2016年3月24日  
 * @author shencl
 */
public class MyLogFactory implements LoggerFactory {
	
	private static Map<String, MyLogFactory> map = new ConcurrentHashMap<String, MyLogFactory>(); 

	private String path;

	private MyLogFactory() {
	}
	
	private MyLogFactory(String path) {
		this.path = path;
	}

	/**
	 * 保证一个路径只产生一个MyLogFactory
	 */
	public synchronized static MyLogFactory getInstance(String path){
		if (map.get(path) != null) {  
            return map.get(path);  
        }  
		return new MyLogFactory(path);
	}
	
	@Override
	public Logger makeNewLoggerInstance(String name) {
		Logger log = Logger.getLogger(name);
		log.setLevel(Level.INFO);
		Layout layout = new PatternLayout("[%d{MM-dd HH:mm:ss,SSS}] %c{10} - %m%n");
		try {
			if (path != null && !path.equals("")) {
				DailyRollingFileAppender fileappender = new DailyRollingFileAppender(layout, path, "'.'yyyy-MM-dd");
				log.addAppender(fileappender);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return log;
	}
}

然后看怎么调用

package com.bj58.zhaoren.sou.utils;

import org.apache.log4j.Logger;

/**
 * @author shencl
 */
public class LogTest {
	private static String path = "d:/logs/query/skill.log";
	
	public static void main(String[] args) {
		Logger l = Logger.getLogger(LogTest.class.getName(), MyLogFactory.getInstance(path));
		l.info("aaaaa");
	}
}

日志文件在 D:\logs\query\skill.log

输出      [03-15 11:31:23,131] com.bj58.zhaoren.sou.utils.LogTest - aaaaa

猜你喜欢

转载自supben.iteye.com/blog/2267834