将STDOUT复制到文件而不停止显示在屏幕上

A J*_*son 4 java stdout stderr

我正在制作的程序旨在无人值守运行,因此我将stdout和stderr流重定向到日志文件.虽然这没有任何问题,但我仍在制作和调试软件,我希望它也显示在屏幕上.这可能吗?

重定向我使用过的流

System.setErr(logWriter);
System.setOut(logWriter);
Run Code Online (Sandbox Code Playgroud)

谢谢.

KCD*_*KCD 8

是.记录框架(即log4j)是最好的,isDebugMode在开发环境中很方便,如果你真的需要"发球"你的标准,你可以这样.

import java.io.PrintStream;
import java.io.File;
public class TeeStream extends PrintStream {
    PrintStream out;
    public TeeStream(PrintStream out1, PrintStream out2) {
        super(out1);
        this.out = out2;
    }
    public void write(byte buf[], int off, int len) {
        try {
            super.write(buf, off, len);
            out.write(buf, off, len);
        } catch (Exception e) {
        }
    }
    public void flush() {
        super.flush();
        out.flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

http://www.exampledepot.com/egs/java.lang/Redirect.html

// import java.io.FileOutputStream;
String dateString = new SimpleDateFormat("yyyyMMdd").format(new Date());
File logFile = new File("mylogfile_" + dateString +".log");
PrintStream logOut = new PrintStream(new FileOutputStream(logFile, true));

PrintStream teeStdOut = new TeeStream(System.out, logOut);
PrintStream teeStdErr = new TeeStream(System.err, logOut);

System.setOut(teeStdOut);
System.setErr(teeStdErr);
Run Code Online (Sandbox Code Playgroud)

你很快就会发现LOG.somelevel(msg)比管理更容易管理System.out.println(msg).当事情运行良好时提高日志级别并在没有部署调试版本时降低级别是很好的.