교재 실습/자바 웹 개발 워크북

113. 로그 출력 켜기 (2)

Jint 2022. 9. 14. 22:13

- 출력 담당자의 유형을 결정

로그 출력 담당자를 정의할 때 제일 먼저 할 일은 출력 담당자의 유형을 결정하는 것이다. 즉 로그를 어디로 출력할지 설정한다. 기본 출력 장치인 모니터로 출력할 수 있고, 파일로 출력할 수 있다. 또는 네트워크를 이용하여 원격의 서버로 출력할 수 있다. 설정 문법은 다음과 같다.

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).

그림 1 (이클립스 콘솔창에 출력된 로그의 일부분1)

로그 내용 중에 mybatis가 실행하는 SQL 문이 보인다.

 

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

그림 2 (이클립스 콘솔창에 출력된 로그의 일부분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).

그림 3 (이클립스 콘솔창에 출력된 로그의 일부분3)

콘솔창에서 TRACE로 시작하는 출력은 TRACE 등급으로 출력하는 로그이다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr