Tôi nhặt ý tưởng từ Michael S., nhưng cũng giống như đề cập trong một bình luận, nó có một số vấn đề: nó không chụp tất cả mọi thứ, và nó in một số dòng sản phẩm nào.
Ngoài ra tôi muốn tách System.out
và System.err
, do đó System.out
sẽ được ghi lại với mức log 'INFO'
và System.err
được đăng nhập với 'ERROR'
(hoặc 'WARN'
nếu bạn thích).
Vì vậy, đây là giải pháp của tôi: Đầu tiên một lớp mở rộng OutputStream
(dễ dàng ghi đè tất cả các phương thức cho OutputStream
hơn cho PrintStream
). Nó ghi nhật ký với mức nhật ký được chỉ định và cũng sao chép mọi thứ sang một số khác OutputStream
. Và nó cũng phát hiện chuỗi "trống rỗng" (chỉ chứa khoảng trắng) và không ghi lại chúng.
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);
}
}
Và sau đó là một lớp tiện ích rất đơn giản để thiết out
và 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)));
}
}
Nguồn
2011-09-20 01:20:24
điều này làm việc với các ngoại lệ, nhưng nó không nắm bắt tất cả các đầu ra được ghi vào stdout. Ví dụ nếu bạn gọi System.out.print (5); nó sẽ bỏ qua luồng in proxy. là tốt, ngay cả với trường hợp ngoại lệ này sẽ kết thúc in thêm dòng trống để stderr nếu bạn làm someException.printStackTrace() – sbridges
hi..where tập tin đăng nhập sẽ tạo ra? cảm ơn bạn –
@sbridges bạn chỉ có thể ghi đè lên nhiều phương thức nếu bạn yêu cầu. Ví dụ, 'printStackTrace' gọi phương thức' println (Object o) 'mà bạn cũng có thể ghi đè để loại bỏ các dòng trống khó chịu đó. – tysonjh