Spring Boot & Slf4j 2 Перехватчик протоколирования метаданных запроса HTTP? - PullRequest
0 голосов
/ 06 июня 2018

Я хотел бы настроить мою настройку ведения журнала таким образом, чтобы входящие запросы были помечены идентификатором (например, UUID), который используется для отслеживания запросов и процессов во всем приложении (например, классы контроллера, классы обслуживания и т. Д.), А также других соответствующихинформация в запросе (т.е. имя хоста, ipaddress ...).

Ссылаясь на документацию по slf4j 2, я вижу упоминание ThreadContext .Для каждого запроса к моему приложению с весенней загрузкой я хотел бы сделать что-то похожее на это:

ThreadContext.put("id", UUID.randomUUID().toString());
ThreadContext.put("ipAddress", this.request.getRemoteAddr());
...

и вызвать эти ключи в PatternLayout для моего отладчика следующим образом:% X {key}.В идеале это должно было бы привести к чему-то похожему на следующее:

[INFO] request #UUID1 #IP1: start.
[INFO] request #UUID1 #IP1: do something controller class 
[INFO] request #UUID2 #IP2: start.
[INFO] request #UUID1 #IP1: do something service class
[INFO] request #UUID2 #IP2: do something controller class 
[INFO] request #UUID2 #IP2: do something service class 
[INFO] request #UUID1 #IP1: end.
[INFO] request #UUID2 #IP2: end.

Хотя я не уверен, как начать фактически реализовывать это.Любое понимание будет оценено!

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

Используя класс, реализующий класс Filter, я смог получить желаемое поведение, используя следующий код, а также вызывая ключи в моем шаблоне Slf4j 2 PatternLayout:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.TimeZone;
import java.util.UUID;

@Component
public class RequestResponseLoggingFilter implements Filter {
    private FilterConfig filterConfig;
    private static String TZ_NAME = "timezoneOffset";

    private static final Logger LOGGER = LogManager.getLogger(RequestBody.class);


@Override
public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
}

/**
 * Sample filter that populates the MDC on every request.
 */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)servletRequest;
    HttpServletResponse response = (HttpServletResponse)servletResponse;

    String requestId = request.getHeader("requestId");

    if (requestId == null) {
        requestId = UUID.randomUUID().toString();
    }

    ThreadContext.put("requestId", requestId);
    ThreadContext.put("ipAddress", request.getRemoteAddr());
    HttpSession session = request.getSession(false);
    TimeZone timeZone = null;
    ThreadContext.put("hostname", servletRequest.getServerName());
    ThreadContext.put("locale", servletRequest.getLocale().getDisplayName());
    if (timeZone == null) {
        timeZone = TimeZone.getDefault();
    }
    ThreadContext.put("timezone", timeZone.getDisplayName());
    LOGGER.info(
            "Logging Request {} : {}", request.getMethod(),
            request.getRequestURI());
    filterChain.doFilter(servletRequest, servletResponse);
    LOGGER.info(
            "Logging Response {} : {}",
            response.getStatus(), response.getContentType());
    ThreadContext.clearMap();
}

@Override
public void destroy() {
}
}
0 голосов
/ 06 июня 2018

Вы должны смотреть на MDC (сопоставленный диагностический контекст) с slf4j https://ivanursul.com/slf4j-mdc

Создайте фильтр сервлетов, который устанавливает необходимые параметры в MDC, они будут доступны через запрос и получатзарегистрирован автоматически.

...