ho preso l'idea da Michael S., ma, come menzionato in uno commento, ha alcuni problemi: non cattura tutto, e la stampa alcune righe vuote.
Inoltre ho voluto separare System.out
e System.err
, in modo che System.out
ottiene registrato con il livello di log 'INFO'
e System.err
ottiene registrato con 'ERROR'
(o 'WARN'
se vi piace).
Quindi questa è la mia soluzione: In primo luogo una classe che estende OutputStream
(è più facile per ignorare tutti i metodi per OutputStream
che per PrintStream
). Registra con un livello di registro specificato e copia anche tutto in un altro OutputStream
. Inoltre rileva le stringhe "vuote" (contenenti solo spazi bianchi) e non le registra.
import java.io.IOException;
import java.io.OutputStream;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LoggerStream extends OutputStream
{
private final Logger logger;
private final Level logLevel;
private final OutputStream outputStream;
public LoggerStream(Logger logger, Level logLevel, OutputStream outputStream)
{
super();
this.logger = logger;
this.logLevel = logLevel;
this.outputStream = outputStream;
}
@Override
public void write(byte[] b) throws IOException
{
outputStream.write(b);
String string = new String(b);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
@Override
public void write(byte[] b, int off, int len) throws IOException
{
outputStream.write(b, off, len);
String string = new String(b, off, len);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
@Override
public void write(int b) throws IOException
{
outputStream.write(b);
String string = String.valueOf((char) b);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
}
E poi una molto semplice classe di utilità per impostare out
e err
:
import java.io.PrintStream;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class OutErrLogger
{
public static void setOutAndErrToLog()
{
setOutToLog();
setErrToLog();
}
public static void setOutToLog()
{
System.setOut(new PrintStream(new LoggerStream(Logger.getLogger("out"), Level.INFO, System.out)));
}
public static void setErrToLog()
{
System.setErr(new PrintStream(new LoggerStream(Logger.getLogger("err"), Level.ERROR, System.err)));
}
}
fonte
2011-09-20 01:20:24
funziona con eccezioni, ma non cattura tutto l'output scritto su stdout. Ad esempio se hai chiamato System.out.print (5); ignorerebbe il flusso di stampa proxy. pure, anche con eccezioni, questo finirà con la stampa di righe vuote aggiuntive su stderr se si esegue qualche eccezioneException.printStackTrace() – sbridges
hi..where il file di registro verrà generato? grazie –
@sbridge puoi semplicemente ignorare più metodi se necessario. Ad esempio, 'printStackTrace' chiama il metodo' println (Object o) 'che potresti anche sovrascrivere per eliminare quelle brutte righe vuote. – tysonjh