[스프링] 로그
Ch11 로그 기록
11.1 Log4j 개요
11.2 인터셉터 개요
11.3 인터셉터를 이용한 로그 기록 만들기
11.1 Log4j 개요
11.1.1 Log4j의 구조와 로깅 레벨
11.1.2 로그 환경 설정 파일의 구성
11.1.1 Log4j의 구조와 로깅 레벨
Log4j: 로깅 프레임워크
logger, appender, layout으로 구성
(1)logger: 로깅 레벨 결정
Log4j의 로깅 레벨
레벨 | 설명 |
FATAL | 조기 종료를 유발하는 심각한 오류 발생(exception/서버 과부하) |
ERROR | 런타임 오류 또는 예기치 않은 상태 |
WARN | 경고성 메시지(사용되지 않는 API 사용, API의 사용 빈도, 오류, 바람직하지 않거나 예기치 않은 런타임 상황) |
INFO | 런타임 이벤트 메시지(함수 호출/실행) |
DEBUG | 시스템 흐름에 대한 자세한 정보(디버그 용도) |
TRACE | 모든 로그에 대한 상세한 정보 |
로깅 레벨은 TRACE가 가장 낮고 FATAL이 가장 높다. 로그를 출력할 때 설정한 레벨 이상의 로그 정보가 출력된다.
(2)appender: 출력 위치 설정
전달받은 로그 정보를 출력할 위치(파일, 콘솔, DB 등)를 결정하는 클래스
Appender 유형
클래스 | 설명 |
ConsoleAppender | 콘솔에 로그 정보 출력 |
FileAppender | 파일에 로그 정보 출력 |
RollingFileAppender | 로그 크기가 지정한 용량 이상이 되면 다른 이름의 파일로 출력 |
DailyRollingFileAppender | 하루 단위로 로그 정보를 파일에 출력 |
SMTPAppender | 로그 메시지를 이메일로 보냄 |
NTEventLogAppender | 윈도우의 이벤트 로그 시스템에 로그 정보 기록 |
(3)layout: 출력 형식 설정
단순한 텍스트 출력, 포맷을 직접 지정한 패턴, HTML 문서 형식 등
layout 클래스 유형
클래스 | 설명 |
DateLayout | 로그 정보를 날짜 중심으로 간단하게 기록 |
HTMLLayout | 로그 정보를 HTML 형식으로 기록 |
PatternLayout | 로그 정보를 사용자 정의 패턴에 따라 기록 |
SimpleLayout | 로그 정보를 레벨-정보 형식으로 간단하게 기록 |
XMLLayout | 로그 정보를 XML 형식으로 기록 |
11.1.2 로그 환경 설정 파일(log4j.xml)의 구성
log4j.xml 저장 경로: src/main/resources
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders: 로그 출력 위치 설정 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n"/>
</layout>
</appender>
<!-- 로그 기능 수행 객체, 로깅 레벨 설정 -->
<!-- Application Loggers -->
<logger name="com.springmvc.controller">
<level value="info"/>
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info"/>
</logger>
<logger name="org.springframework.beans">
<level value="info"/>
</logger>
<!-- Root Logger: 최상위 로거 설정 -->
<root>
<priority value="warn"/>
<appender-ref ref="console"/>
</root>
11.2 인터셉터 개요
11.2.1 인터셉터
11.2.2 인터셉터 등록
11.2.1 인터셉터
URL 요청시 컨트롤러가 웹으로 응답하기 전에 가로채어 특정 작업을 처리함
컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 함
컨트롤러 요청 전후에 요청/응답을 가로채기 때문에 다음과 같은 특정 작업 수행에 사용 가능
- 응답 페이지 출력 전에 서버에서 미리 데이터를 가져오는 기능(spooling)
- 폼에서 제출(submit)이 중복으로 일어나는 것을 막는 기능
- 요청이 처리되기 전에 파일을 업로드(multipart)
- 각 요청에 대한 상세한 내역을 기록(logging)
- 시간별 동작 및 성능의 병목 지점을 검사(profiling)
11.2.2 인터셉터 등록
인터셉터를 만들기 위해서는 HandlerInterceptor 인터페이스 구현 또는 HandlerInterceptorAdaptor 클래스 상속 필요
인터셉터 구현 클래스를 servlet-context.xml 파일의 <interceptors> 요소를 사용해서 빈으로 등록
<!-- 모든 웹 요청 URL에 적용 -->
<interceptors>
<bean id=" " class="인터셉터 클래스(패키지 포함)"/>
</interceptors>
<!-- 특정 웹 요청 URL에 적용 -->
<interceptors>
<interceptor>
<mapping path="특정 패턴의 요청 URL"/>
<beans:bean id=" " class="인터셉터 클래스(패키지 포함)"/>
</interceptor>
</interceptors>
11.3 인터셉터를 이용한 로그 기록 만들기
11.3.1 HandlerInterceptor를 이용한 로그 기록
HandlerInterceptor 인터페이스: preHandle(), postHandle(), afterCompletion() 보유
○preHandle()
웹 요청 URL이 컨트롤러에 들어가기 전에 호출
false로 반환하면 이후 내용 실행 x
○postHandle()
웹 요청 URL을 컨트롤러가 처리한 후 호출
컨트롤러에서 예외가 발생하면 더 이상 실행되지 않음
○afterCompletion()
컨트롤러가 웹 요청을 처리하여 뷰에 응답 전송이 종료된 후 호출
HandlerInterceptor를 사용한 메서드 호출
public class ExampleInterceptor implements HandlerInterceptor{
public Logger logger = LoggerFactory.getLogger(ExampleInterceptor.class);
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
logger.info("preHandle() 호출...");
if(handler instanceof HandlerMethod){
HandlerMethod method = (HandlerMethod) handler;
logger.info("핸들러 메서드명: "+ method.getMethod().getName());
}
return true;
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
logger.info("postHandle() 호출...");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception{
logger.info("afterCompletion() 호출...");
}
}
11.3.2파일로 로그 기록 출력
11.3.3 HandlerInterceptorAdapter를 이용한 로그 기록