Log4j文件变化监控实现和原理

       在项目中使用到文件变化的监控,在Log4j中同样也有文件监控功能具体实现类为FileWatchdog。当系统启动的时候,加载log4j的时候,记录log4j配置文件最后修改时间,每间隔一段时间,获取log4j的配置文件的最后修改时间如果大于内存中记录最后修改时间,说明log4j配置文件改变。则重新加载log4j配置文件。

log4j变化监控类:

 

package com.easyway.app.log4j.file;

import java.io.File;

import org.apache.log4j.helpers.LogLog;
/**
 *log4j源代码分析,在Log4j中同样也有文件监控功能具体实现类为FileWatchdog。
 *当系统启动的时候,加载log4j的时候,记录log4j配置文件最后修改时间,每间隔一段时间,
 *获取log4j的配置文件的最后修改时间如果大于内存中记录最后修改时间,说明log4j配置文件改变。
 *则重新加载log4j配置文件。
 * @author longgangbai
 *
 */
public abstract class FileWatchdog extends Thread {

	protected FileWatchdog(String filename) {
		super("FileWatchdog");
		delay = 60000L;
		lastModif = 0L;
		warnedAlready = false;
		interrupted = false;
		this.filename = filename;
		file = new File(filename);
		//设置为后台进程
		setDaemon(true);
		//启动开始检查
		checkAndConfigure();
	}

	public void setDelay(long delay) {
		this.delay = delay;
	}

	/**
	 * 重新加载log4j配置文件
	 *
	 */
	protected abstract void doOnChange();
   
	/**
	 * 检查log4j配置文件变化的方法
	 *
	 */
	protected void checkAndConfigure() {
		boolean fileExists;
		//检查文件是否存在,
		try {
			fileExists = file.exists();
		} catch (SecurityException e) {
			LogLog.warn("Was not allowed to read check file existance, file:["
					+ filename + "].");
			interrupted = true;
			return;
		}
		//如果存在获取最后修改时间与内存记录的原最后修改时间比较
		if (fileExists) {
			long l = file.lastModified();
			if (l > lastModif) {
				lastModif = l;
				doOnChange();
				warnedAlready = false;
			}
		} else if (!warnedAlready) {
			LogLog.debug("[" + filename + "] does not exist.");
			warnedAlready = true;
		}
	}

	/**
	 * 执行执行的方法
	 */
	public void run() {
		while (!interrupted) {
			try {
				//检查的修改时间间隔
				Thread.sleep(delay);
			} catch (InterruptedException e) {
			}
			//检查log4j配置
			checkAndConfigure();
		}
	}

	public static final long DEFAULT_DELAY = 60000L;

	protected String filename;

	protected long delay;

	File file;

	long lastModif;

	boolean warnedAlready;

	boolean interrupted;
}

 

 

log4j.xml配置文件监控类:

package com.easyway.app.log4j.file;

import org.apache.log4j.LogManager;
import org.apache.log4j.helpers.FileWatchdog;
import org.apache.log4j.xml.DOMConfigurator;
/**
 * 针对log4j.xml变化加载的方法
 * @author longgangbia
 *
 */
public class XMLWatchdog extends FileWatchdog {

	public XMLWatchdog(String filename) {
		super(filename);
	}

	public void doOnChange() {
		(new DOMConfigurator()).doConfigure(super.filename, LogManager
				.getLoggerRepository());
	}
}

 

 

针对log4j.properties文件监控实现类:

package com.easyway.app.log4j.file;

import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.helpers.FileWatchdog;
/**
 * 针对log4j.properties变化加载的方法
 * @author longgangbia
 *
 */
class PropertyWatchdog extends FileWatchdog {

	PropertyWatchdog(String filename) {
		super(filename);
	}

	public void doOnChange() {
		(new PropertyConfigurator()).doConfigure(super.filename, LogManager
				.getLoggerRepository());
	}
}

 

你可能感兴趣的:(log4j)