113. 로그 출력 켜기 (2)
- 출력 담당자의 유형을 결정
로그 출력 담당자를 정의할 때 제일 먼저 할 일은 출력 담당자의 유형을 결정하는 것이다. 즉 로그를 어디로 출력할지 설정한다. 기본 출력 장치인 모니터로 출력할 수 있고, 파일로 출력할 수 있다. 또는 네트워크를 이용하여 원격의 서버로 출력할 수 있다. 설정 문법은 다음과 같다.
log4j.appender.이름=출력 담당자(패키지명 포함한 클래스명)
출력 담당자를 지정하는 프로퍼티 이름은 항상 'log4j.appender'로 시작합니다. 다음은 출력 담당자 역할을 수행하는 클래스를 정리한 표이다. 주요 로그 출력자 클래스를 보여준다.
출력 담당자 클래스 | 설명 |
org.apache.log4j.ConsoleAppender | System.out 또는 System.err로 로그를 출력한다. 기본은 System.out 이다. 즉 표준 출력 장치인 모니터로 출력한다. |
org.apache.log4j.FileAppender | 파일로 로그를 출력한다 |
org.apache.log4j.net.SocketAppender | 원격의 로그 서버에 로그 정보를 담은 LoggingEvent 객체를 보낸다. |
예제에서는 모니터로 로그를 출력하기 위해 출력 담당자를 ConsoleAppender 클래스로 설정하였다.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- 로그 출력 형식 정의
로그 출력 담당자를 결정했으면, 다음으로 로그의 출력 형식을 정의해야 한다. 간단히 문자열을 출력할 수 있고, XML 형식으로 출력할 수 있다. 또는 HTML 테이블 형식이나 특정 패턴을 가진 문자열을 출력할 수 있다. 문법은 다음과 같다.
log4j.appender.이름.layout=출력형식 클래스(패키지명을 포함한 클래스명)
다음은 '출력형식 클래스'를 정리한 표이다.
출력 형식 클래스 | 설명 |
org.apache.log4j.SimpleLayout | 출력형식은 '출력 등록 - 메시지'이다. 출력 결과 예) DEBUG - DB Connection Error! |
org.apache.log4j.HTMLLayout | HTML 테이블 형식으로 출력한다. |
org.apache.log4j.PatternLayout | 변환 패턴의 형식에 따라 로그를 출력한다. 변환 패턴 예) %-5p [%t]: %m%n 출력 결과 예) DEBUG [main]: Message 1 WARN [main]: Message 2 |
org.apache.log4j.xml.XMLLayout | log4j.dtd 규칙에 따라 XML을 만들어 출력한다. 출력 결과 예) <?xml version="1.0"?> <!DOCTYPE log4j:eventSet PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd" [<!ENTITIY data SYSTEM "abc">]> <log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/"> &data; </log4j:eventSet> |
예제에서는 특정 패턴의 문자열을 출력하기 위해 PatternLayout 클래스를 사용하였다.
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- PatternLayout의 패턴 정의
PatternLayout 클래스에서 로그를 출력할 때 사용할 패턴을 정의한다. 프로퍼티 이름은 ConversionPattern 이다.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
'%5p'는 로그 출력 등급을 5자리 문자열로 출력하라는 명령이다. '%t'는 스레드의 이름을 출력하는 명령이다. '%m'은 로그 내용을 출력하는 명령이다. '%n'은 다음 라인을 지정하는 명령이다. 다음은 이 패턴의 출력 결과이다.
DEBUG [http-bio-9999-exec-3] - ooo Using Connection ...
DEBUG [http-bio-9999-exec-3] - ==> Preparing: SELECT ...
DEBUG [http-bio-9999-exec-3] - ==> Parameters:
DEBUG [http-bio-9999-exec-3] - <== Total: 6
ConversionPattern을 정의하는 더 자세한 방법은 Log4J 사이트(https://logging.apache.org/log4j/2.x/)를 참고한다.
- 특정 패키지의 클래스에 대해 로그의 출력 등급 설정하기
루트 로거에서 정의한 등급보다 다른 등급의 로그를 출력하고 싶다면, 다음과 같이 하위 로거에 대해 별도의 등급을 지정하면 된다. 'log4j.logger'는 하위 로거를 정의할 때 프로퍼티 이름 앞에 붙이는 접두어이다. 'spms.dao'는 패키지 이름으로서 이 패키지에 소속된 클래스에 대해 로그 출력 등급을 DEBUG로 설정하겠다는 뜻이다.
log4j.logger.spms.dao=DEBUG
2. 로그 출력 테스트
톰캣 서버를 재시작한 뒤, 웹 브라우저에서 http://localhost:9999/web07/project/list.do를 요청한다. 다음은 이클립스 콘솔창에 출력된 내용이다(그림 1).

로그 내용 중에 mybatis가 실행하는 SQL 문이 보인다.
프로젝트의 상세 정보를 출력하는 SQL 문을 확인해 본다. 프로젝트 목록에서 임의의 제목을 클릭한 후 콘솔창의 내용을 확인한다(그림 2).

SQL문의 WHERE절을 보면 프로젝트 번호를 입력 받는 매개변수 선언이 보인다.
WHERE PNO = ?
그리고 이어서 PNO에 들어갈 값을 출력하고 있다.
DEBUG [http-nio-9999-exec-7] - ==> Parameters: 3(Integer)
이렇게 mybatis의 로그 출력 기능을 켜면 개발하는 동안 내부에서 실행하는 SQL문의 실체를 확인할 수 있어 프로그램을 디버깅하는데 매우 도움이 된다.
# 로그 출력 등급 'TRACE'
DEBUG보다 더 자세한 내용을 보고 싶다면 로그 출력 등급을 'TRACE'로 올리면 된다. 예를 들어 SELECT문의 실행 결과를 로그로 출력하고 싶다면 로그 출력 등급을 TRACE로 바꾸면 된다. TRACE는 DEBUG보다 더 자세한 로그를 출력한다. 한 번 테스트해본다.
log4j.properties 파일에서 log4j.logger.spms.dao 속성값을 TRACE로 변경한다.
# 하위 로거의 출력 등급 설정
log4j.logger.spms.dao=TRACE
톰캣을 재시작하고, 프로젝트 목록을 다시 요청한다. 다음은 이클립스 콘솔창에 출력된 로그이다(그림 3).

콘솔창에서 TRACE로 시작하는 출력은 TRACE 등급으로 출력하는 로그이다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr