Si todavía hay alguien buscando una solución a este problema. Esto es lo que finalmente se me ocurrió: acabo de subclasificar StreamHandler y agregué un parámetro adicional MaxLevel, que se comprueba al comienzo de publish(). Si el nivel del evento de registro es mayor que MaxLevel, la publicación no se ejecutará más. Aquí están los detalles:
MaxlevelStreamHandler.java clase principal a continuación.
package helper;
/**
* The only difference to the standard StreamHandler is
* that a MAXLEVEL can be defined (which then is not published)
*
* @author Kai Goergen
*/
import java.io.PrintStream;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class MaxlevelStreamHandler extends StreamHandler {
private Level maxlevel = Level.SEVERE; // by default, put out everything
/**
* The only method we really change to check whether the message
* is smaller than maxlevel.
* We also flush here to make sure that the message is shown immediately.
*/
@Override
public synchronized void publish(LogRecord record) {
if (record.getLevel().intValue() > this.maxlevel.intValue()) {
// do nothing if the level is above maxlevel
} else {
// if we arrived here, do what we always do
super.publish(record);
super.flush();
}
}
/**
* getter for maxlevel
* @return
*/
public Level getMaxlevel() {
return maxlevel;
}
/**
* Setter for maxlevel.
* If a logging event is larger than this level, it won't be displayed
* @param maxlevel
*/
public void setMaxlevel(Level maxlevel) {
this.maxlevel = maxlevel;
}
/** Constructor forwarding */
public MaxlevelStreamHandler(PrintStream out, Formatter formatter) {
super(out, formatter);
}
/** Constructor forwarding */
public MaxlevelStreamHandler() {
super();
}
}
Clase Principal
Para mostrar ahora algunos eventos en la salida estándar y algunos en stderr, simplemente configuración dos StreamLoggers, uno de los eventos críticos y uno para todos los demás, y desactivar el registrador consola estándar:
// setup all logs that are smaller than WARNINGS to stdout
MaxlevelStreamHandler outSh = new MaxlevelStreamHandler(System.out, formatter);
outSh.setLevel(Level.ALL);
outSh.setMaxlevel(Level.INFO);
logger.addHandler(outSh);
// setup all warnings to stdout & warnings and higher to stderr
StreamHandler errSh = new StreamHandler(System.err, formatter);
errSh.setLevel(Level.WARNING);
logger.addHandler(errSh);
// remove default console logger
logger.setUseParentHandlers(false);
logger.info("info");
logger.warning("warning");
logger.severe("severe");
Hope this helps!
Actualización: Agregué super.flush() justo después de super.publish() para asegurarme de que el mensaje se muestra inmediatamente. Antes, tenía problemas con los mensajes de registro que siempre se mostraban al final. Ahora es parte del código anterior.
Creo que ConsoleHandler es el predeterminado, hay un StreamHandler que puede imprimir en cualquier otra secuencia. – Uri
Sí, pero querría crear una subclase de StreamHandler para evitar intentar cerrar System.err, sospecho. –