2010-11-25 4 views
1

Java 프로그램의 stdout과 stderror를 줄 단위로 캡처하는 방법이 있습니까?Java : stdout과 stderr를 어떤 종류의 핸들러에 프로그램하십시오.

아마도 addHandler을 사용하여 Logger 인스턴스에 처리기를 추가하는 것과 비슷한 방법 일 수 있습니다.

편집 : 기본 처리기를 바꾸고 싶지 않습니다. 출력물을 명령 줄에 표시해야합니다.

+0

요구 사항의 이유는 무엇입니까? 로깅 또는 디버깅을위한 것이라면 stderr 및 stdout 대신 로깅 프레임 워크 사용을 고려해야합니다. 만약 당신이 * nix 시스템에 있다면 stdout과 stderr를 파일로 리다이렉션하여 파일을 꼬리 수 있습니다. – beggs

+0

나는 프로그램을위한 콘솔 출력을 얻을 수있는 스트리밍 API를 작성 중입니다. 따라서 콘솔에 무엇이 들어가든지 http 스트림으로 볼 수도 있습니다. –

답변

3

System.setOut()System.setErr()을 사용하면 표준 출력 및 오류 스트림을 모든 PrintStream에 설정하고 모든 것을 캡처 할 수 있습니다.

ADDITION : 이 작업을 수행 할 수있는 우아한 방법이 존재하는 경우 나도 몰라,하지만 그렇게하는 한 가지 방법은 다음과 같습니다
1. 저장 기본 출력 스트림
의 PrintStream defaultOut = System.out에;
(System.getOut()하지만이 재미있을 것이다) (당신이 원하는의 PrintStream (예 : 모든 파일) 대신에서 System.out.println을 사용
3.
2. 리디렉션 System.out을)를 사용하여 인쇄 다음 않는 함수 :
인쇄 (객체 O) {
defaultOut.println (O); // defaultOut이 기능
에서 System.out.println (O)에 표시된다고 가정하면; }

+0

출력물이 여전히 com에 있어야하기 때문에 PrintStream을 바꾸고 싶지 않습니다. 명령 줄. –

+0

감사합니다. –

2

방법 System.setOutSystem.setErr 당신이 System.outSystem.err 변수가 참조하는 PrintStream 객체를 변경할 수 있습니다. 그것들을 사용하여 기본 PrintStream 오브젝트를 출력을 캡처하는 오브젝트로 대체하거나 원하는 것을 수행 할 수 있습니다.

후속 나는 여전히 명령 줄로 이동합니다 출력을 필요로하기 때문에 PrintStreams을 대체하지 않으

.

  1. 다른 OutputStream 인스턴스에 대한 모든 출력을 기록 OutputStream의 서브 클래스를 작성, 또한 출력을 캡처 :

코드는 그 돌볼 수 있습니다. "other"인스턴스를 constructort 매개 변수로 만듭니다.

  • System.outSystem.err의 현재 값을 가져옵니다.
  • System.err 값을 생성자 매개 변수로 각각 사용하여 서브 클래스를 두 번 인스턴스화하십시오.
  • 두 인스턴스를 PrintStream 인스턴스로 래핑하십시오.
  • System.outSystem.errPrintStream 인스턴스로 바꾸려면 System.setOutSystem.setErr으로 전화하십시오.
  • +0

    나는 13 초 늦었다. ( –

    +0

    이것은 System.out과 System.err 스트림을 리다이렉트 시키지만, "kill - kill"명령을 실행할 때와 같이 JVM이 직접 출력하는 것은 리다이렉트하지 않을 것이다. 3 "을 쓰면 스레드와 덤프 정보가 덤프됩니다. –

    +0

    명령 행으로 출력하려면 여전히 출력이 필요하기 때문에 PrintStream을 바꾸지 않으려합니다. –

    1

    Message Console은 출력을 텍스트 창에 표시하고 명령 줄에 표시 할 수있게합니다.

    관련 문제