view src/luan/modules/logging/Log4j.java @ 1365:6617763dfd76

fix logging and lucene backup
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 12 Jun 2019 22:16:10 -0600
parents 7483108154bb
children
line wrap: on
line source

package luan.modules.logging;

import java.util.Enumeration;
import java.util.List;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.apache.log4j.Hierarchy;
import org.apache.log4j.Level;
import org.apache.log4j.Appender;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.RootLogger;
import org.apache.log4j.spi.RepositorySelector;
import luan.Luan;
import luan.LuanException;
import luan.LuanTable;


public final class Log4j {
	private static final String KEY = "Logger.Repository";
	private static final LoggerRepository defaultLoggerRepository = LogManager.getLoggerRepository();

	public static void newLoggerRepository(Luan luan) {
		Logger oldLogger = defaultLoggerRepository.getRootLogger();
		Logger newLogger = new RootLogger(Level.DEBUG);
		LoggerRepository lr = new Hierarchy(newLogger);
		for( Enumeration en = oldLogger.getAllAppenders(); en.hasMoreElements(); ) {
			Appender appender = (Appender)en.nextElement();
			newLogger.addAppender(appender);
		}
		luan.registry().put(KEY,lr);
	}

	private static LoggerRepository getLoggerRepository(Luan luan) {
		LoggerRepository lr = (LoggerRepository)luan.registry().get(KEY);
		return lr != null ? lr : defaultLoggerRepository;
	}

	static {
		LogManager.setRepositorySelector( new RepositorySelector() {
			public LoggerRepository getLoggerRepository() {
				Luan luan = LuanLogger.luan();
				return luan==null ? defaultLoggerRepository : Log4j.getLoggerRepository(luan);
			}
		}, new Object() );
	}

	public static Logger getRootLogger(Luan luan) {
		return getLoggerRepository(luan).getRootLogger();
	}

	public static Logger getLogger(Luan luan,String name) {
		return getLoggerRepository(luan).getLogger(name);
	}

	// because logger.removeAllAppenders() closes the appenders
	public static void removeAllAppenders(Logger logger) {
		List<Appender> list = new ArrayList<Appender>();
		for( Enumeration en = logger.getAllAppenders(); en.hasMoreElements(); ) {
			Appender appender = (Appender)en.nextElement();
			list.add(appender);
		}
		for( Appender appender : list ) {
			logger.removeAppender(appender);
		}
		if( logger.getAllAppenders().hasMoreElements() )
			throw new RuntimeException();
	}
}