如何将PrintStream绑定到System.out和错误流

时间:2016-07-27 06:51:00

标签: java logging printstream

我正在尝试将我的PrintStream对象绑定到控制台的输出和错误流,这样我在那里写的任何内容也都会被写入我的日志文件。

public static void tieOutputStreams(String fileName) {
    try {
        File output = new File(fileName);
        FileWriter writer = new FileWriter(output);
        writer.close();
        outputStream = new TiedOutputStream(output);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    System.setErr(outputStream);
    System.setOut(outputStream);
}

一旦我完成了写作,我就可以将其重置为现状。

public static void resetOutputStreams() {
    outputStream.close();
    System.setErr(System.err);
    System.setOut(System.out);
}

TiedOutputStream类如下所示:

public class TiedOutputStream extends PrintStream {
    public TiedOutputStream(File logFile) throws FileNotFoundException {
        super(logFile);
    }

    @Override
    public void print(Object obj) {
        super.print(obj);
        System.out.print(obj);
    }

    @Override
    public PrintStream printf(String format, Object... args) {
        super.printf(format, args);
        System.out.printf(format, args);
        return this;
    }

    @Override
    public void println(Object args) {
        super.println(args);
        System.out.println(args);
    }
}

我的主要方法:

public static void main(String[] args) {
    try {
        TieOutputStreams.tieOutputStreams("./sample.log");
        System.out.println("Output console");
        System.err.println("Error console");
        float num = 1.123456f;
        System.out.printf("A float: %.6f", num);
    } catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        TieOutputStreams.resetOutputStreams();
    }
}

我希望在我的日志文件和系统控制台(out / err)上打印这些语句。由于我不知道的原因,这是行不通的。我感谢所有的答案和评论。提前谢谢!

我知道有Log4j。但无论如何我想这样做。

1 个答案:

答案 0 :(得分:0)

这不起作用主要是因为您没有保存原始System.out而且因为您没有覆盖println(String obj)当您致电System.out.println("Output console");时,您赢了&{ #39;击中你重写的方法,因为那个期望和对象,PrintStream中有一个更具体的方法需要String参数

这似乎有效:

 public class TiedOutputStream extends PrintStream {

    private final PrintStream sout;
    private final PrintStream serr;

    public TiedOutputStream(File logFile) throws FileNotFoundException {
        super(logFile);
        sout = System.out;//save standard output
        serr = System.err;
    }

    @Override
    public void print(Object obj) {
        super.print(obj);
        sout.print(obj);
    }

    @Override
    public void println(String obj) {
        super.println(obj);
        sout.println(obj);
    }

    @Override
    public PrintStream printf(String format, Object... args) {
        super.printf(format, args);
        sout.printf(format, args);
        return this;
    }

    @Override
    public void println(Object args) {
        super.println(args);
        sout.println(args);
    }

}

不确定为什么tieOutputStreams创建了FileWriter

public static void tieOutputStreams(String fileName) {
    try {
        File output = new File(fileName);
        outputStream = new TiedOutputStream(output);
        System.setErr(outputStream);
        System.setOut(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

main方法保持不变。您应该将resetOutputStreams更新为原始outerr。如果我愿意,我会覆盖PrintStream的所有print *方法。