在較大的程序中,我使用靜態java.util.logging.Logger
實例,但將System.err
連續重定向到幾個不同的文件。 Logger
未能第二次登錄,我嘗試重定向System.err
。System.setErr()干擾記錄器
這是一個測試程序,以顯示該問題:
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.logging.Logger;
class TestRedirect {
static final Logger logger = Logger.getLogger("test");
public static void main(String[] args) throws FileNotFoundException {
for (int i = 1; i <= 2; i++) {
TestRedirect ti = new TestRedirect();
ti.test(i);
}
}
void test(int i) throws FileNotFoundException {
PrintStream filePrintStream = new PrintStream("test" + i + ".log");
PrintStream stderr = System.err; // Save stderr stream.
System.setErr(filePrintStream); // Redirect stderr to file.
System.err.println("about to log " + i);
logger.info("at step " + i);
System.setErr(stderr); // Restore stderr stream.
filePrintStream.close();
}
}
這裏的輸出:
test1.log:
about to log 1
Jan 28, 2014 4:34:20 PM TestRedirect test
INFO: at step 1
test2.log:
about to log 2
我想我會在test2.log看到Logger
- 生成的消息也是如此。爲什麼Logger
停止工作,我能做些什麼呢?
我通常建議不要在Java中重定向標準流,如果有另一種可能的方法。你確定*你需要使用'setErr()'? – Darkhogg
@Darkhogg:原來的程序實際上是使用Groovy'SystemOutputInterceptor'(基本上是一個基於'FilteredOutputStream'的「tee」)來將stdout和stderr指向日誌文件以及控制檯。 'SystemOutputInterceptor'調用'setErr()'。該程序的各個部分中有一些正在使用記錄器,有些只是將信息和錯誤寫入stderr和stdout。 –