2012-02-01 33 views
0

閱讀我有在我開始另一個進程,並試圖登錄的所有標準輸出和標準錯誤SLF4J一些非常簡單的Java代碼。輸出停止從我的過程

this.service.serverProcess = Runtime.getRuntime().exec(arguments); 

this.service.serverIsRunning = true; 

BufferedReader serverStdout = new BufferedReader(new InputStreamReader(
        this.service.serverProcess.getInputStream()), 16); 
BufferedReader serverStderr = new BufferedReader(new InputStreamReader(
        this.service.serverProcess.getErrorStream()), 16); 

String stdoutLine = null; 
String stderrLine = null; 

while ((stdoutLine = serverStdout.readLine()) != null || 
     ((stderrLine = serverStderr.readLine()) != null)) { 
    if (stdoutLine != null && stdoutLine.trim().length() > 0) 
     logger.info("{}", stdoutLine); 
    if (stderrLine != null && stderrLine.trim().length() > 0) 
     logger.error("{}", stderrLine); 
} 

try { this.service.serverProcess.waitFor(); } catch (InterruptedException e) {}; 

this.service.serverIsRunning = false; 

不幸的是,我只得到輸出從我的過程中的第一行,我從來沒有看到任何比這更多的產出,但我敢肯定,還有更多的輸出比我所看到的。

什麼錯嗎?我希望它在事件發生後立即登錄,因爲輸出對於我保留的日誌很重要。如何獲得我的流程的STDOUT和STDERR的完整輸出?

回答

2

我懷疑問題是你從來沒有從stderr中讀取 - 所以如果進程已經填充了stderr的任何緩衝區但沒有向stdout輸出任何內容,則會阻止嘗試讀取stdout。

我建議你開始在不同的線程讀取環中的一個:一個從標準輸出讀取和一個從標準錯誤讀取。