본문 바로가기

Spring

Spring boot netty access log 남기는 방법

728x90
반응형

Spring boot에서 netty를 사용할 경우 access log가 남지 않는다.

톰캣을 사용하는 경우 access log를 남길 수 있지만 netty는 설정을 해줘야 access log를 남길 수 있다.

 

 

자바 프로퍼티 설정에 추가


-Dreactor.netty.http.server.accessLogEnabled=true

 

주의할 점은 Spring property가 아니라 Java System Property에 추가를 해야 한다.

 

 

Logback 설정


    <appender name="accessLog" class="ch.qos.logback.core.FileAppender">
        <file>access_log.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="accessLog" />
    </appender>

    <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
        <appender-ref ref="async"/>
    </logger>

 

AccessLog 클래스에서 accesslog를 남기기 때문에 해당클래스를 loback설정을 통해 출력해주면 된다.

 

netty AccessLog Customizing


accesslog를 보기 편하게 커스터마이징할 수 있다.

해당 부분은 WebServerFactoryCustomizer를 구현하면 된다.


@Component
public class NettyWebServerCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {


    private static final String LOG_FORMAT = "{} - {} [{}] \"{} {} {}\" {} {} {} {}";
    private static final String REFERER = "Referer";

    private static final String MISSING = "-";
    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
        factory.addServerCustomizers(httpServer ->
            httpServer.accessLog(true,
                    x -> AccessLog.create(LOG_FORMAT,
                            applyAddress(x.remoteAddress()),
                            x.user(),
                            x.accessDateTime(),
                            x.method(),
                            x.uri(),
                            x.protocol(),
                            x.status(),
                            x.contentLength() > -1 ? x.contentLength() : MISSING,
                            x.duration(),
                            x.requestHeader(REFERER) != null ? x.requestHeader(REFERER) : MISSING))
        );
    }

    private static String applyAddress(@Nullable SocketAddress socketAddress) {
        return socketAddress instanceof InetSocketAddress ? ((InetSocketAddress) socketAddress).getHostString() :
                MISSING;
    }


}

 

 

이렇게 설정하면 아래와 같이 로그가 남는다.

 

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/reactor-netty-access-logs.html

 

Reactor Netty Access Logs :: Spring Cloud Gateway

To enable Reactor Netty access logs, set -Dreactor.netty.http.server.accessLogEnabled=true.

docs.spring.io

 

 

 

728x90
반응형