티스토리 뷰

3) slf4j를 이용한 로그남기기

이전에 작성했던 guestbook 프로젝트의 LogInterceptor.javalog4j를 추가합니다.

실습

pom.xml 파일에서 다음 부분을 수정합니다.

<dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>${spring.version}</version>

</dependency>

위의 부분을 아래와 같이 수정합니다.

<!-- 로깅 관련 -->

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-api</artifactId>

            <version>1.7.25</version>

        </dependency>

 

        <dependency>

            <groupId>ch.qos.logback</groupId>

            <artifactId>logback-classic</artifactId>

            <version>1.2.3</version>

        </dependency>

 

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>jcl-over-slf4j</artifactId>

            <version>1.7.25</version>

        </dependency>

 

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>${spring.version}</version>

            <exclusions>

                <exclusion>

                    <groupId>commons-logging</groupId>

                    <artifactId>commons-logging</artifactId>

                </exclusion>

            </exclusions>

        </dependency>

 

resource폴더에 logback.xml 파일을 작성합니다.

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="30 seconds">

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

        <encoder>

            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>

        </encoder>

    </appender>

 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>/tmp/access.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>/tmp/access-%d{yyyy-MM-dd}.log</fileNamePattern>

            <maxHistory>30</maxHistory>

        </rollingPolicy>

 

        <encoder>

            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>

        </encoder>

    </appender>

 

    <logger name="org.springframework" level="info"/>

    <logger name="kr.or.connect" level="debug"/>

 

    <root level="debug">

        <appender-ref ref="CONSOLE"/>

        <appender-ref ref="FILE"/>

    </root>

</configuration>

 

LogInterceptor.java를 아래와 같이 수정합니다.

package kr.or.connect.guestbook.interceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

public class LogInterceptor extends HandlerInterceptorAdapter{

           private Logger logger = LoggerFactory.getLogger(this.getClass());

 

           @Override

           public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

                                  ModelAndView modelAndView) throws Exception {

//                    System.out.println(handler.toString() + " 가 종료되었습니다.  " + modelAndView.getViewName() + " view로 사용합니다.");

                      logger.debug("{} 가종료되었습니다. {} view로 사용합니다.", handler.toString(), modelAndView.getViewName());

           }

 

           @Override

           public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

                                  throws Exception {

//                    System.out.println(handler.toString() + " 를 호출했습니다.");

                      logger.debug("{} 를 호출했습니다.", handler.toString());

                      return true;

           }

 

          

}

 

콘솔 출력
파일 출력

로그가 파일로도 출력되는 것을 알 수 있습니다.

 

생각해보기

  • 인터셉터를 이용하면 컨트롤러의 시작과 종료 시에 로그를 남길 수 있습니다. 이러한 인터셉터를 이용해서 컨트롤러 메소드의 실행 시간을 구하려면 어떻게 해야 할까요?

참고 자료

[참고링크] Logback Project

https://logback.qos.ch

[참고링크] How to use logback

https://github.com/sonegy/how-to-use-logback

 

Comments