자바·JSP2012. 8. 29. 10:10

System.out.println()는 매우 강력하고 사랑받는 디버깅 도구이다. 문제는, 이 코드를 디버그할 때는 잘 사용하고, 그 후에는 지우지 않는다는 점이다.

이런 일이 몇번 정도 반복되면, 불필요한 메시지가 콘솔에 무더기로 출력되어 꼭 필요한 디버깅 메시징을 보기가 힘들어지는 불상사가 벌어질 수 있다. 그러나 메시지를 어디서 출력하였는지 추적하는 것은 매우 힘들다. 시스템 콘솔 출력은 디버그를 이용하여 추적하는 것도 불가능하다. 방대한 양의 소스코드를 일일히 검색하는 것도 쉬운 일은 아니며, 또 메시지는 동적으로 생성된 것이어서 검색이 불가능 할 수도 있다.

이런 경우, 아래와 같은 간단한 디버깅 툴을 삽입해 이 문제를 해결 할 수 있다:

/**
 * @author Jeeeyul 2011. 11. 1. 오후 4:36:51
 * @since M1.10
 */
public class DebugStream extends PrintStream {
	private static final DebugStream INSTANCE = new DebugStream();
 
	public static void activate() {
		System.setOut(INSTANCE);
	}
 
	private DebugStream() {
		super(System.out);
	}
 
	@Override
	public void println(Object x) {
		showLocation();
		super.println(x);
	}
 
	@Override
	public void println(String x) {
		showLocation();
		super.println(x);
	}
 
	private void showLocation() {
		StackTraceElement element = Thread.currentThread().getStackTrace()[3];
		super.print(MessageFormat.format("({0}:{1, number,#}) : ", element.getFileName(), element.getLineNumber()));
	}
}

위와 같은 클래스를 하나 만든 뒤, DebugStream.activate()를 적절한 시점에 호출 해 주면 된다. 이 후로 System.out.println 을 통해 출력되는 메시지는 다음과 같이 보이게 된다:

(SemanticPatchSystem.java:47) : 세만틱 패치 수정 시작
(AbstractDiagramEditor.java:1140) : 메시지

이 형태로 인쇄한 경우, 콘솔에서 곧바로 클릭하여 해당 소스코드를 볼 수 있게 된다.

Posted by 미랭군