Spring logback valve

29 May 2017

embedded tomcat을 사용하는 spring boot에서 request가 들어온 경우, 해당 request와 response를 log로 남기기 위해서 아래와 같이 logback-access 설정을 통해 logback valve를 설정할 수 있습니다.

가장 먼저 resources 폴더에 아래와 같이 어떠한 형식으로 log를 남길 것인지에 대해서, 아래와 같이 xml 파일로 설정하도록 합니다.

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%fullRequest%n%n%fullResponse</pattern>
        </encoder>
    </appender>

    <appender-ref ref="STDOUT">
    </appender-ref>
</configuration>
이후, 아래와 같이 logback valve를 설정해주면 됩니다.
package org.blog.test.config;

import ch.qos.logback.access.tomcat.LogbackValve;
import org.apache.catalina.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ResourceLoader;

@Configuration
public class LogbackValveConfig {

    @Autowired
    ResourceLoader resourceLoader;

    @Bean
    public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
        return container -> {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                ((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers((TomcatContextCustomizer) context -> {
                    LogbackValve valve = new LogbackValve();
                    valve.setFilename(resourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + "logback-access.xml").getFilename());
                    context.getPipeline().addValve(valve);
                });
            }
        };
    }
}
위와 같이 설정한 이후, request가 들어오게 되면 아래와 같이 설정한대로 log가 찍히게 된 것을 확인할 수 있습니다.

- 출력 결과
GET /server/info HTTP/1.1
host: localhost:8080
connection: keep-alive
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
accept-encoding: gzip, deflate, sdch, br
accept-language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4



HTTP/1.1 200 OK
Content-Length: 11
Date: Mon, 29 May 2017 11:39:49 GMT
Content-Type: text/html;charset=UTF-8
전체 예제는 아래 링크에서 다운로드 받을 수 있다.

https://gitlab.com/shashaka/logback-valve-project