2011-09-20 2 views
1

log4j를 사용하여 콘솔에 출력하는 Java 프로그램이 이미 있지만 다른 Java 프로그램을 사용하여 첫 번째 프로세스 (하위 프로세스)를 호출하고 출력을 가로채는 것이 좋습니다. 나는 XXX, log4j에 의해 생성되지 메시지를 에코 일부 코드 내가 출력 메시지를 얻을 수 있지만, 단지 를 사용하여 "run.bat를"에서 할 수 상위 프로세스에서 하위 프로세스의 출력을 가로 채는 방법

class StreamRedirector extends Thread { InputStream is; StreamRedirector(InputStream is) { this.is = is; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line=null; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ............. try { Process p = Runtime.getRuntime().exec("run.bat"); StreamRedirector errSR = new StreamRedirector(p.getErrorStream()); StreamRedirector outSR = new StreamRedirector(p.getInputStream()); errSR.run(); outSR.run(); int exitVal = p.waitFor(); System.out.println("Exit Value: " + exitVal); } log4j config: <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] [%c{1}] %m%n" /> </layout> </appender> 

아래처럼,이 페이지 http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4의 방법을 사용합니다. "run.bat"을 실행하면 콘솔에서 두 출력을 모두 볼 수 있습니다. 부모 프로세스에서 log4j 출력을 얻을 수있는 방법이 있습니까? 감사.

답변

1

StreamRedirectorThread으로 확장되지만 runstart이 아닙니다. 즉, run이 호출 스레드에서 동 기적으로 호출 중입니다. 즉, 다음을 의미합니다.

errSR.run(); 
    outSR.run(); 

두 번째 줄은 처음 완료 될 때까지 실행되지 않습니다. 오류 스트림이 많은 출력을 생성하지 않으면 결국 완료됩니다 같아요. 그러나 그것이 정말로 당신이하고자하는 일입니까? 프로그램이 다른 프로세스에서 기록되는 것을 잡기 위해 SocketAppender을 고려하는 것이 내가 당신을 촉구 log4j를 사용하는 경우 대신

errSR.start(); 
    outSR.start(); 

을 시도합니다.

EIDT : StreamRedirectorRunnable 대신 Thread 확장하는 또 다른 방법입니다. 호출 코드는이 errorThread.run() 전화에서 당신을 방지하지 않습니다하지만 당신은 다음을 호출 할 경우 뭔가 잘못된 것을 건의 (대신 현재처럼 차단의) 즉시 반환됩니다

Thread errorThread = new Thread(new StreamRedirector(p.getErrorStream())); 
.... 
errorThread.start(); 

로 변경됩니다.

+1

대단히 감사합니다. Hemal, 저는 어리석은 실수를해서 유감입니다. P – daniel

+0

얼마나 많은 사람들이 그 실수를 저지르고 있는지 놀랄 것입니다. 그것을 피하는 방법은 위의 편집을 참조하십시오. –

관련 문제