2009年12月13日日曜日

log4j - java.util.logging bridge

log4j の出力を java.util.logging にリダイレクトするためのアペンダを書いてみた.がうまく動かなかったので,ここに捨てておく.いや,動いたには動いたのだが出力がへん. もっといいやり方としては,slf4j を間に挟む方法があるらしい.それをやってみよう.
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

public class JDKLogAppender extends AppenderSkeleton {
    static Map map = new HashMap();
    static Map levelMap = 
      new HashMap ();  
    static {
        levelMap.put(org.apache.log4j.Level.FATAL, java.util.logging.Level.SEVERE);
        levelMap.put(org.apache.log4j.Level.ERROR, java.util.logging.Level.SEVERE);
        levelMap.put(org.apache.log4j.Level.WARN, java.util.logging.Level.WARNING);
        levelMap.put(org.apache.log4j.Level.INFO, java.util.logging.Level.INFO);    
        levelMap.put(org.apache.log4j.Level.DEBUG, java.util.logging.Level.FINE);            
        levelMap.put(org.apache.log4j.Level.TRACE, java.util.logging.Level.FINER);            
    }

    private Logger getLogger(String name){
        Logger logger = map.get(name);
        if (logger != null)
            return logger;
        logger = Logger.getLogger(name);
        map.put(name, logger);
        return logger;
    }
    
    @Override
    protected void append(LoggingEvent event) {
        String loggerName = event.getLoggerName();    
        Logger logger = getLogger(loggerName);
        logger.log(levelMap.get(event.getLevel()), layout.format(event));
    }        

    @Override
    public void close() {
    }

    @Override
    public boolean requiresLayout() {
        return true;
    }
}

0 件のコメント: