본문 바로가기
교재 실습/자바 웹 개발 워크북

112. 로그 출력 켜기 (1)

by Jint 2022. 9. 13.

이번 절에서는 mybatis의 로그 출력 기능을 활용하는 방법에 대해 알아본다. mybatis는 내부 작업을 추적하고 실행 상태를 파악하기 위해 주요 작업마다 로그를 출력하고 있다. 다만 mybatis의 이런 기능을 사용할지 말지 결정은 개발자의 선택이다. mybatis의 로그 출력 기능을 켜면 mybatis에서 실행하는 SQL문과 매개변수 값, 실행 결과를 실시간으로 확인할 수 있다. 특히 동적 SQL문이 실행 조건에 따라 어떻게 달라지는지 확인할 수 있어 프로그램을 디버깅할 때 매우 유용하다.

 

1. mybatis 설정 파일에 로그 설정 추가

mybatis의 로그 출력 기능을 켜려면 설정 파일에 그 내용을 추가해야 한다. 다음 지시에 따라 mybatis를 설정한다.

spms/dao 폴더에서 'mybatis-config.xml'을 열고 다음과 같이 편집한다.

<configuration>
	
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>

	<typeAliases>
		<typeAlias type="spms.vo.Project" alias="project"/>
		<typeAlias type="spms.vo.Member" alias="member"/>
	</typeAliases>
    
    ...

<typeAliases> 태그 앞에 <settings> 태그를 추가한다. 그리고 <setting> 태그를 사용하여 로그 출력기를 지정한다. mybatis는 여기에서 지정한 도구를 사용하여 로그를 출력한다. 이것이 mybatis의 로그 출력 기능을 켜는 것이다. 만약 로그 출력기를 지정하지 않는다면 로그 출력 기능은 동작하지 않는다.

<setting name="logImpl" value="LOG4J"/>

로그 출력기를 설정할 때 name 속성은 "logImpl", value 속성은 로그 출력기 이름이다. 예제 소스에서 설정한 로그 출력기는 LOG4J 이다.

 

- 로그 출력 구현체

LOG4J 외에 value에 넣을 수 있는 값은 다음 표와 같다.

value 속성값 설명
SLF4J SLF4J
LOG4J Log4j
LOG4J2 Log4j 2
JDK_LOGGING JDK logging
COMMONS_LOGGING Apache Commons Logging
STDOUT_LOGGING 표준 출력 장치로 출력
NO_LOGGING 로그 출력 기능 사용 안 함
클래스명(패키지명 포함) org.apache.ibatis.logging.Log 인터페이스의 구현체

 

# Log4J 라이브러리 파일 준비

Log4J를 사용하려면 이와 관련된 JAR 파일을 준비해야 한다. 그러나 mybatis와 관련된 파일들을 복사할 때 이미 그와 관련된 파일들을 복사했기 때문에 별도로 해야할 일은 없다. 다만, 해당 파일이 존재하는지만 다시 확인한다.

web07 프로젝트 폴더에서 webapp/WEB-INF/lib 폴더를 펼치고, log4j-x.x.x.jar 파일이 있는지 확인한다. log4j-1.2.17.jar 파일이 들어있으면 되며, 파일의 버전이 달라도 괜찮다. 예제에서는 reload4j-1.2.21.jar를 사용했다. log4j 1.2.x 버전이 장기적으로 유지보수가 안돼서 생긴 보안 이슈를 해결한 버전이라고 한다(그림 1).

참고 링크 : https://kwonnam.pe.kr/wiki/java/log4j

 

java:log4j [권남]

 

kwonnam.pe.kr

그림 1 (Log4J JAR 파일)

 

# Log4J 설정 파일 작성

Log4J를 사용하기 위한 라이브러리 파일이 준비되었으면 이제 설정 파일을 작성해야 한다. 이 파일에는 로그의 수준, 출력 방식, 출력 형식, 로그 대상 등에 대한 정보가 들어간다. 이 파일은 자바 클래스 경로(CLASSPATH)에 두어야 한다.

web07/src/main/java 경로 log4j.properties 파일을 생성하고 다음과 같이 편집한다.

# Global logging configuration
log4j.rootLogger=ERROR, stdout

# MyBatis logging configuration...
log4j.logger.spms.dao=TRACE

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

- 로그의 출력 등급 설정

제일 먼저 루트 로거의 출력 등급(Level)을 ERROR로 설정하였다. 루트 로거(rootLogger)란, 최상위 로거를 가리킨다. 하위 로거들은 항상 부모의 출력 등급을 상속받는다. 하위 로거들의 등급을 별도로 설정하지 않으면 루트 로거의 출력 등급과 같은 ERROR가 된다.

log4j.rootLogger=ERROR, stdout

그림 2 (출력 등급에 대한 상속 관계)

앞의 그림 2를 보면 루트 로거의 출력 등급이 ERROR이기 때문에 하위 로거들의 기본 출력 등급은 ERROR이다. 다만 'spms.controls'라는 이름을 가진 로거는 INFO 등급으로 설정했기 때문에 그 하위 로거들은 INFO 등급을 갖는다. 'spms.dao' 이름의 로거는 최상위 로거와 달리 DEBUG 등급을 갖는다. 다음은 로그 출력 등급을 정리한 표이다.

로그 출력 등급 설명
FATAL 애플리케이션을 중지해야 할 심각한 오류
ERROR 오류가 발생했지만, 애플리케이션은 계속 실행할 수 있는 상태
WARN 잠재적인 위험을 안고 있는 상태
INFO 애플리케이션의 주요 실행 정보
DEBUG 애플리케이션의 내부 실행 상황을 추적해 볼 수 있는 상세 정보
TRACE 디버그보다 더 상세한 정보

로그 출력 등급을 ERROR로 설정하면 FATAL의 오류 내용도 포함하여 출력한다. WARN은 ERROR의 오류 내용을 포함하고, INFO는 WARN의 오류 내용을 포함한다. 즉 로그 출력 등급표에서 아래의 등급은 위의 등급을 포함한다. TRACE로 설정하면 모든 로그를 출력한다.

 

- 출력 담당자 선언

루트 로거의 출력 등급을 설정하는 값 다음에는 출력 담당자(Appender)의 이름이 온다. 예제에서는 출력 담당자의 이름을 'stdout'이라고 하였다.

log4j.rootLogger=ERROR, stdout

출력 담당자가 여럿일 때 담당자의 이름도 그 수만큼 지정한다. 출력 담당자의 이름은 마음대로 지정할 수 있다. 이름을 선언했으면 그 이름을 사용하여 출력 담당자를 정의한다.

 

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

 

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

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

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

114. 동적 SQL의 사용 (1)  (0) 2022.09.18
113. 로그 출력 켜기 (2)  (0) 2022.09.14
111. mybatis 설정 파일 (3)  (1) 2022.09.09
110. mybatis 설정 파일 (2)  (0) 2022.09.07
109. mybatis 설정 파일 (1)  (0) 2022.09.06

댓글