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);
}
}
}