2009-06-23 4 views
1

메서드가 STDERR에 대한 쓰기를 생성 할 때 내가 잡을 수있는 방법이 있습니까? 각 STDERR 쓰기와 함께 일부 정보를 미리 보류하려고합니다.메소드가 stderr를 생성 할 때 STDERR에 정보를 어떻게 추가합니까?

parser.thatGeneratesSTDERR(); 

가 생성됩니다 뭔가 라인 37:29 문자 없음 대안 'A'

난 그냥 그것을 포장 할 수

같은 :

은의 우리의 방법이 가정 해 봅시다 작성해야 할 stderr을 잡아서 정보를 미리 보류하면 다음과 같이 보입니다.

파일 : mybadfile.txt - 라인 37:29 내가 아마 STDERR 쓰기하지만 난 정말하지 않으려을 수행하는 실제 코드를 통해 팔 수있는 알 '은'

문자에 어떤 대안이 그 대신에이 메서드 대신에 일부 코드를 대신 감쌀 것입니다.

나는이 방법이 항상 STDERR을 생성하는 것은 아니라는 점에 유의해야한다. 나는 그들을 잡으려고하는 이유는 어떤 STDERR도 생성해서는 안되기 때문이다. 그러나 이것은 꽤 많은 파일에서 호출되기 때문에 40 이상) 어떤 파일이 오류 메시지를 생성하는지 알 수 없다. 찾는 데 영원히 걸린다.

UPDATE 그래서 예치, 우리는 우리의 STDERR을 변경할 수 있습니다 - 난 그냥 내 새로운 STDERR 내에 println를 오버라이드 (override) 할 필요가 잊고 있었다 ... 여기에 관련 코드 : 다음

public static String errfile = ""; 

static { 
    final PrintStream currentErr = System.err; 
    PrintStream newErr = new PrintStream(currentErr) 
    { 
    public void println(String string) { 
     print("File: " + errfile + " --"); 
     print(string); 
     super.println(); 
    } 
    }; 

    System.setErr(newErr); 
} 

에 대한 내가해야하는 모든 파일은 errfile을 파일 이름으로 변경하고 출력은 예상대로 나온다.

감사합니다.

+0

PrintStream final을 만드는 것이 좋은지 잘 모르겠습니다. - 코드가 작동하지 않을 수 있으므로 코드에 버그가있는 것 같습니다. –

답변

1

System.setErr의 작동 방식을 고려해 볼 수 있을지 모르겠습니다.

인쇄 스트림을 확장하고 주석 앞에 메서드를 덮어 쓰는 새로운 클래스를 만듭니다. 그런 다음 오류 스트림을 새 printstream으로 설정하십시오. 이 새로운 클래스에서 System.err.printxxx를 호출하지 마십시오.

예 ...

class PrependPrintStream extends PrintStream { 

PrependPrintStream(PrintStream ps, String pre){...} 
... 
public void print(boolean b) { 
super.print(this.pre); 
super.print(b); 
} 
... 

태양의 PrintStream impl을 조사해 보았습니다. protected가 아닌 private 인 writexxx 대리자처럼 보입니다. 복사/붙여 넣기 코드를 추측 할 수 있습니다.

편집 :

훨씬 더 나은 솔루션 대신 System.err에의 로깅을 사용하는 것입니다. 이렇게하면 명령문을 껐다 켤 수 있으며 사용자 정의 오류 처리기를 만들 수 있습니다. 특정 핸들러는 인쇄하기 전에 원하는 문을 System.err에 추가 할 수 있습니다. 이것은 또한 특정 로거를 사용하는 명령문이 앞에 붙은 텍스트와 System.err에 대한 다른 호출을 가지지 않는 장점이 있습니다.

+0

예 .. 불행히도 나는 stderr에 로그하는 코드를 탐색하는 것을 고려하지 않고있다. 나는 단지 그것을 오버라이드하기를 원하고 이제는 작동한다 - thnx – eyberg

1

아마도 AOP (Aspect Oriented Programming)를보고 싶을 것 같은데요. AOP를 사용하여 호출중인 파서에 대한 프록시를 만들 수 있습니다. 메소드 호출 전에 thatGeneratesSTDERR()을 호출하면 호출 할 수 있습니다. 전화를 걸면 원하는 정보를 출력 할 수 있습니다.

AOP 작동 방식을 이해하려면 약간의 독서가 필요합니다.

AspectJ를 - http://www.eclipse.org/aspectj/

AOP 얼라이언스 - http://sourceforge.net/projects/aopalliance

0

당신은 당신의 자신의 PrintStream에 표준 오류 리디렉션 System.setErr를 사용할 수 있습니다.

관련 문제