메소드가 stderr을 생성할 때 STDERR 앞에 정보를 어떻게 추가합니까?
문제
메서드가 STDERR에 쓰기를 생성할 때 잡을 수 있는 방법이 있나요?각 STDERR 쓰기에 일부 정보를 추가하려고 합니다.
우리의 방법이 다음과 같다고 가정해 보겠습니다.
parser.thatGeneratesSTDERR();
그것은 다음과 같은 것을 생성 할 것입니다
37:29행 문자 'a'에 실행 가능한 대안이 없습니다.
Stderr을 잡아서 글을 쓰고 정보를 미리 지불하는 무언가로 마무리 할 수 있습니까?
파일:mybadfile.txt -- 37:29행 문자 'a'에 실행 가능한 대안이 없습니다.
STDERR 작성을 수행하는 실제 코드를 자세히 조사할 수 있다는 것을 알고 있지만 실제로는 그렇게 하고 싶지 않습니다. 대신 이 메서드 주위에 일부 코드를 래핑하는 것이 좋습니다.
이 방법이 항상 STDERR을 생성하는 것은 아니라는 점에 유의해야 합니다. 제가 이를 잡으려고 하는 이유는 어떤 STDERR도 생성해서는 안 되기 때문입니다. 하지만 이 방법은 꽤 많은 파일(40개 이상)에서 호출되기 때문에 어떤 파일이 오류 메시지를 생성하는지 알 수 없습니다. 찾는 데 시간이 오래 걸립니다.
업데이트네, STDERR을 변경할 수 있습니다. 새 STDERR에서 println을 재정의해야 한다는 사실을 잊어버렸습니다...관련 코드는 다음과 같습니다.
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을 파일 이름으로 변경하기만 하면 예상대로 출력이 나옵니다.
정말 감사합니다!
해결책
System.setErr의 작동 방식을 고려하면 이것이 작동할지는 잘 모르겠습니다.
인쇄 스트림을 확장하고 주석 앞에 추가할 메서드를 덮어쓰는 새 클래스를 만들겠습니다.그런 다음 오류 스트림을 새 인쇄 스트림으로 설정하십시오.이 새 클래스에서 System.err.printxxx를 호출하지 마세요.
전...
class PrependPrintStream extends PrintStream {
PrependPrintStream(PrintStream ps, String pre){...}
...
public void print(boolean b) {
super.print(this.pre);
super.print(b);
}
...
나는 sun의 PrintStream impl을 조사해 보았고 보호되는 대신 비공개인 write(String)에 대한 모든 printxxx 위임처럼 보입니다.코드를 복사/붙여넣기하시면 될 것 같습니다.
편집하다::
ㅏ 많이 더 나은 해결책은 System.err 대신 Logging을 사용하는 것입니다.이를 통해 명령문을 켜고 끌 수 있으며 사용자 정의 오류 처리기를 만들 수 있습니다.특정 처리기는 System.err로 인쇄하기 전에 문자열 앞에 원하는 명령문을 추가할 수 있습니다.이는 또한 특정 로거를 사용하는 명령문에만 텍스트가 추가되고 System.err에 대한 다른 호출에는 추가되지 않는다는 장점도 있습니다.
다른 팁
아마도 AOP(Aspect Oriented 프로그래밍)를 살펴보고 싶은 것 같습니다.AOP를 사용하면 호출하는 파서에 대한 프록시를 만들 수 있습니다.thatGeneratesSTDERR() 메서드를 호출하기 전에 호출하도록 할 수 있습니다.통화에서 원하는 정보를 출력할 수 있습니다.
AOP의 작동 방식을 이해하려면 약간의 독서가 필요할 수 있습니다.
AspectJ - http://www.eclipse.org/aspectj/
AOP 얼라이언스 - http://sourceforge.net/projects/aopalliance
당신이 사용할 수있는 시스템.setErr stderr를 자신의 PrintStream으로 리디렉션합니다.