Log 4 jファイル変化モニタリングの実現と原理

3914 ワード

プロジェクトではファイル変化のモニタリングが用いられ,Log 4 jにおいても同様にファイルモニタリング機能の具体的な実装クラスがFileWatchdogである.システムが起動すると、log 4 jがロードされると、log 4 jプロファイルの最終変更時間が記録され、間隔を置いてlog 4 jを取得するプロファイルの最終変更時間がメモリに記録された最終変更時間より大きい場合は、log 4 jプロファイルの変更を説明します.log 4 jプロファイルを再ロードします.
log 4 j変化モニタリングクラス:
 
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());
	}
}

 
 
log 4 jについて.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());
	}
}