package com.meidusa.amoeba.log4j;
import org.apache.log4j.LogManager;
import org.apache.log4j.helpers.FileWatchdog;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.helpers.OptionConverter;
import org.w3c.dom.Element;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
/**
* 从XML文件配置log4j的工具类。和Log4j默认的<code>DOMConfigurator</code>相比,这个类允许提供额外的properties对象,在配置文件中被引用。
*/
public class DOMConfigurator extends org.apache.log4j.xml.DOMConfigurator {
private Properties props;
/**
* 创建新对象。
*/
public DOMConfigurator() {
this(null);
}
/**
* 创建新对象。
*
* @param props 可在配置文件中被引用的属性
*/
public DOMConfigurator(Properties props) {
this.props = props;
}
/**
* 使用XML文件配置log4j。
*
* @param filename 配置文件名
*/
public static void configure(String filename) {
new DOMConfigurator().doConfigure(filename, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param stream 配置文件输入流
*/
public static void configure(InputStream stream) {
new DOMConfigurator().doConfigure(stream, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param filename 配置文件名
* @param props 可在配置文件中被引用的属性
*/
public static void configure(String filename, Properties props) {
new DOMConfigurator(props).doConfigure(filename, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param url 配置文件的URL
*/
public static void configure(URL url) {
new DOMConfigurator().doConfigure(url, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param url 配置文件的URL
* @param props 可在配置文件中被引用的属性
*/
public static void configure(URL url, Properties props) {
new DOMConfigurator(props).doConfigure(url, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param element 配置文件名的DOM element
*/
public static void configure(Element element) {
new DOMConfigurator().doConfigure(element, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j。
*
* @param element 配置文件名的DOM element
* @param props 可在配置文件中被引用的属性
*/
public static void configure(Element element, Properties props) {
new DOMConfigurator(props).doConfigure(element, LogManager.getLoggerRepository());
}
/**
* 使用XML文件配置log4j,同时监控文件的更改。
*
* @param filename 配置文件名
*/
public static void configureAndWatch(String filename) {
configureAndWatch(filename, null, FileWatchdog.DEFAULT_DELAY);
}
/**
* 使用XML文件配置log4j,同时监控文件的更改。
*
* @param filename 配置文件名
* @param props 可在配置文件中被引用的属性
*/
public static void configureAndWatch(String filename, Properties props) {
configureAndWatch(filename, props, FileWatchdog.DEFAULT_DELAY);
}
/**
* 使用XML文件配置log4j,同时监控文件的更改。此方法将创建一个监控线程,该线程第隔指定时间就会检查文件是否被创建或改变,如果是,则从文件中读取log4j配置。
*
* @param filename 配置文件名
* @param interval 监控线程检查间隔(ms)
*/
public static void configureAndWatch(String filename, long interval) {
XMLWatchdog xdog = new XMLWatchdog(filename, null);
xdog.setDelay(interval);
xdog.start();
}
/**
* 使用XML文件配置log4j,同时监控文件的更改。此方法将创建一个监控线程,该线程第隔指定时间就会检查文件是否被创建或改变,如果是,则从文件中读取log4j配置。
*
* @param filename 配置文件名
* @param props 可在配置文件中被引用的属性
* @param interval 监控线程检查间隔(ms)
*/
public static void configureAndWatch(String filename, Properties props, long interval) {
XMLWatchdog xdog = new XMLWatchdog(filename, props);
xdog.setDelay(interval);
xdog.start();
}
/**
* 设置属性,这些属性可以在配置文件中被引用。
*
* @param props 属性
*/
public void setProperties(Properties props) {
this.props = props;
}
/**
* 替换字符串值,将其中的${xxx}替换成具体的值。
*
* @param value 要替换的值
*
* @return 替换后的值
*/
protected String subst(String value) {
try {
return OptionConverter.substVars(value, props);
} catch (IllegalArgumentException e) {
LogLog.warn("Could not perform variable substitution.", e);
return value;
}
}
/**
* 监控线程。
*/
private static class XMLWatchdog extends FileWatchdog {
private Properties props;
public XMLWatchdog(String filename, Properties props) {
super(filename);
this.props = props;
}
public void doOnChange() {
new DOMConfigurator(props).doConfigure(filename, LogManager.getLoggerRepository());
LogLog.warn("log4j config load completed from file:"+filename);
}
}
}