私は Michael S. からアイデアを受け取りましたが、あるコメントで述べたように、いくつかの問題があります。すべてをキャプチャするわけではなく、いくつかの空の行が出力されます。
System.out
また、 と を分離したかったSystem.err
ので、System.out
ログレベルでログ'INFO'
にSystem.err
記録され、'ERROR'
(または必要'WARN'
に応じて) でログに記録されます。
これが私の解決策です。まず、拡張するクラスです( forよりもOutputStream
すべてのメソッドをオーバーライドする方が簡単です)。指定されたログ レベルでログを記録し、すべてを別の にコピーします。また、「空の」文字列 (空白のみを含む) を検出し、ログに記録しません。OutputStream
PrintStream
OutputStream
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);
}
}
次に、非常に単純なユーティリティ クラスを設定out
して次のようにし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)));
}
}