Java Logging APIでログレベル毎に出力先を分けたい
Java Logging APIのConsoleHandlerはデフォルトでSystem.errに出力する。
今回はLevel.INFOから下はSystem.outでそれより上はSystem.errに出力のように
出力先を分けたいと思ったので作ったものをメモ
作ったクラス
package jp.yustam.logging; import java.io.OutputStream; import java.util.logging.Filter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.SimpleFormatter; import java.util.logging.StreamHandler; public class CustomHandler extends StreamHandler { public CustomHandler(OutputStream out, Level min, Level max) { super(); setOutputStream(out); setFilter(new CustomFilter(min, max)); setFormatter(new SimpleFormatter()); setLevel(Level.ALL); } @Override public synchronized void publish(LogRecord record) { super.publish(record); flush(); } @Override public void close() { flush(); } } class CustomFilter implements Filter { /** 出力する最小のレベル */ private final Level min; /** 出力する最大のレベル */ private final Level max; CustomFilter(Level min, Level max) { this.min = min; this.max = max; } public boolean isLoggable(LogRecord record) { return (min.intValue() <= record.getLevel().intValue()) && record.getLevel().intValue() <= max.intValue(); } }
使い方
private static Logger logger = null; protected static Logger getLogger(){ if (logger == null) { logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); // ↓を設定しないとデフォルトのログも一緒に出る logger.setUseParentHandlers(false); // FINEST < FINER < FINE < CONFIG < INFO < WARNING < SEVERE logger.addHandler(new CustomHandler(System.out, Level.FINEST, Level.INFO)); logger.addHandler(new CustomHandler(System.err, Level.WARNING, Level.SEVERE)); } return logger; }