读书人

Log4j资料变化监控实现和原理

发布时间: 2012-06-27 14:20:08 作者: rapoo

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

?

读书人网 >开源软件

热点推荐