Spring Boot:使用嵌入式 Jetty 服务器时记录所有传入的 HTTP 请求?

dim*_*imi 3 jetty spring-mvc embedded-jetty spring-boot

我正在使用 Spring Boot 1.1.5.RELEASE 构建一个 Web 应用程序,并按照相关 Spring Boot 文档中的描述配置了一个嵌入式 Jetty 。

我想记录所有传入的 HTTP 请求,我能想到的唯一解决方案(在阅读Spring Boot 文档中的“如何配置 Jetty”之后)是引入一个 EmbeddedServletContainerCustomizer:

package com.acme.rest;

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.jetty.JettyServerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;


/**
 * blah blah
 * 
 * @author Dimi
 */
@Component
public class EmbededJettyConfig implements EmbeddedServletContainerCustomizer {

    /*
     * (non-Javadoc)
     * 
     * @see org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer # customize
     */
    @Override
    public void customize(final ConfigurableEmbeddedServletContainer container) {
        // checks whether the container is Jetty
        if (container instanceof JettyEmbeddedServletContainerFactory) {
            ((JettyEmbeddedServletContainerFactory) container)
                    .addServerCustomizers(jettyServerCustomizer());
        }
    }

    @Bean
    public JettyServerCustomizer jettyServerCustomizer() {

        return new JettyServerCustomizer() {

            /*
             * (non-Javadoc)
             * 
             * @see org.springframework.boot.context.embedded.jetty.JettyServerCustomizer #
             * customize
             */
            @Override
            public void customize(final Server server) {

                HandlerCollection handlers = new HandlerCollection();
                RequestLogHandler requestLogHandler = new RequestLogHandler();
                handlers.setHandlers(new Handler[] {new DefaultHandler(), requestLogHandler});
                server.setHandler(handlers);

                NCSARequestLog requestLog = new NCSARequestLog("logs/requests.log");
                requestLog.setExtended(false);
                requestLogHandler.setRequestLog(requestLog);
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序现在无法开始抛出异常:

java.lang.IllegalArgumentException:需要 ServletContext 来配置默认 servlet 处理

简而言之:在 Spring Boot 中配置嵌入式 Jetty 日志记录的正确方法是什么?

Ste*_*ner 5

setRequestLogJetty 9.3.8在服务器上有一个新方法。

@Component
public class EnableRequestLog implements EmbeddedServletContainerCustomizer {

    private static final JettyServerCustomizer USE_SLF4J_REQUEST_LOG =
            server -> server.setRequestLog(new Slf4jRequestLog());

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        if (container instanceof JettyEmbeddedServletContainerFactory) {
            ((JettyEmbeddedServletContainerFactory) container)
                    .addServerCustomizers(USE_SLF4J_REQUEST_LOG);
        } else {
            throw new IllegalArgumentException(
                    "Expected a Jetty container factory but encountered " + container.getClass());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以实现特定的RequestLog. 请参阅http://www.eclipse.org/jetty/documentation/current/configuring-jetty-request-logs.html