Включить ведение журнала в SpringMVC , без использования Spring-boot - PullRequest
0 голосов
/ 29 сентября 2019

Я создаю простой проект SpringMVC , и хочу регистрировать все входящие запросы, включая uri / query / payload / clientIp ..., всю информацию.

Все ресурсы, которые я могу найти, относятся к Spring Boot, Например: https://www.javadevjournal.com/spring/log-incoming-requests-spring/

Я также прочитал официальные документы и нашел опцию «enableLoggingRequestDetails», но подробностей об этом нет, я пробовал и не работал.https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-logging

Итак, как реализовать это в чистой среде SpringMVC (без Spring Boot)?

Есть ли встроенный подход SpringMVC для этого?

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

1. Вы можете реализовать класс Filter , расширяющийся от OncePerRequestFilter , и тогда каждый запрос будет проходить через ваш фильтр.Затем вы можете войти, что вы хотите внутри этого класса.

    @Slf4j
    @Component
    public class RequestLoggingFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            log.debug(
                    String.format("FILTERED URL: %s", request.getRequestURI())
            );

            //continue filtering
            filterChain.doFilter(request, response);
        }
    }

2. Другой способ - реализовать класс Interceptor, расширяющийся с HandlerInterceptorAdapter .

    @Slf4j
    @Component
    public class RequestLoggingHandler extends HandlerInterceptorAdapter {

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            log.debug(
                    String.format("HANDLER(pre) URL: %s", request.getRequestURI())
            );

            return super.preHandle(request, response, handler);
        }

        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            log.debug(
                    String.format("HANDLER(post) URL: %s", request.getRequestURI())
            );

            super.postHandle(request, response, handler, modelAndView);
        }
    }

Но вы должны включить этот перехватчик, явно добавив его через конфигурацию.

    @Configuration
    public class WebApplicationConfiguration implements WebMvcConfigurer {

        @Setter(onMethod_ = @Autowired)
        private RequestLoggingHandler requestLogger;

        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(requestLogger);
        }
    }

3. Еще один способ - использовать стандарт CommonsRequestLoggingFilter .

Таким образом, вы должны настроить его следующим образом:

@Configuration
public class RequestLoggingFilterConfig {

    @Bean
    public CommonsRequestLoggingFilter logFilter() {
        CommonsRequestLoggingFilter filter
          = new CommonsRequestLoggingFilter();
        filter.setIncludeQueryString(true);
        filter.setIncludePayload(true);
        filter.setMaxPayloadLength(10000);
        filter.setIncludeHeaders(false);
        filter.setAfterMessagePrefix("REQUEST DATA : ");
        return filter;
    }
}

, а затем включить его в logback.xml:

<logger name="org.springframework.web.filter.CommonsRequestLoggingFilter">
    <level value="DEBUG" />
</logger>
0 голосов
/ 29 сентября 2019

Используя Перехватчик , вы можете достичь этого. Проверьте ссылки ниже, вы получите представление

введите описание ссылки здесь

spring-mvc-handlerinterceptor

spring-mvc-4, как перехватить запрос-с-обработчиком-перехватчиком

Редактировать:

Использование CommonsRequestLoggingFilter

Spring MVC предоставляет CommonsRequestLoggingFilter, который может регистрировать URL-адрес запроса, тело и другую связанную информацию.

CommonsRequestLoggingFilter

LoggingConfig.java


import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:logging.properties")
public class LoggingConfig {

    @Autowired
    private Environment env;

    public CommonsRequestLoggingFilter requestLoggingFilter() {
        CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
        loggingFilter.setIncludeClientInfo(env.getProperty("logging.client"));
        loggingFilter.setIncludeQueryString(env.getProperty("logging.query"));
        loggingFilter.setIncludePayload(env.getProperty("logging.payload"));
        loggingFilter.setIncludeHeaders(env.getProperty("logging.headers"));
        return loggingFilter;
    }

    @Bean
    public CommonsRequestLoggingFilter springLogging() {
        Logger logger = (Logger) LoggerFactory.getLogger(CommonsRequestLoggingFilter.class);
                logger.setLevel(Level.DEBUG);
        return requestLoggingFilter();
    }
}

logging.properties

logging.client = true
logging.query = true
logging.payload = true
logging.headers = true
0 голосов
/ 29 сентября 2019

Хорошо, чтобы включить ведение журнала в приложении Spring, все, что вам нужно, это

Библиотека журналов и файл ее свойств

Чтобы Log4j работал с зависимостью JCL по умолчанию (commons-logging) все, что вам нужно сделать, это поместить Log4j в путь к классам и предоставить ему файл конфигурации (log4j.properties или log4j.xml в корне пути к классам).

<dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.14</version>
      <scope>runtime</scope>
   </dependency>

log4j.свойства

log4j.rootCategory=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

log4j.category.org.springframework.beans.factory=DEBUG

См. Spring doc и образец project

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...