J'ai pris l'idée de Michael S., mais comme mentionné dans un autre commentaire, il a quelques problèmes: il ne rend pas compte de tout, et il affiche des lignes vides.
Aussi je voulais séparer System.out
et System.err
, de sorte qu' System.out
obtient connecté avec le niveau de journal 'INFO'
et System.err
obtient connecté avec 'ERROR'
(ou 'WARN'
si vous le souhaitez).
Donc, c'est ma solution:
D'abord une classe qui étend la classe OutputStream
(il est plus facile de remplacer toutes les méthodes d' OutputStream
que PrintStream
). Il se connecte avec un certain niveau de journal et aussi des copies de tout autre OutputStream
. Et aussi il détecte le "vide" des chaînes de caractères (contenant des espaces uniquement) et n'enregistre pas.
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);
}
}
Et puis un utilitaire très simple classe pour définir out
et 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)));
}
}