2012-02-01 1 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을 읽는 것을 차단하게됩니다.

다른 스레드에서 읽기 루프 중 하나를 시작하는 것이 좋습니다. 하나는 stdout에서 읽고 다른 하나는 stderr에서 읽는 것입니다.

관련 문제