| | |
| | | package com.xiaopeng.map.config.log; |
| | | |
| | | import com.xiaopeng.common.log.config.LogHeaderProperties; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.slf4j.MDC; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.core.Ordered; |
| | | import org.springframework.core.annotation.Order; |
| | | import org.springframework.http.MediaType; |
| | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Arrays; |
| | | import java.util.HashSet; |
| | | import java.util.Set; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 请求/响应日志过滤器 |
| | |
| | | @Component |
| | | @Order(Ordered.HIGHEST_PRECEDENCE + 10) |
| | | public class RequestResponseLoggingFilter extends OncePerRequestFilter { |
| | | |
| | | @Autowired |
| | | private LogHeaderProperties logHeaderProperties; |
| | | |
| | | /** 不打印 body 的路径前缀(健康检查、actuator 等) */ |
| | | private static final Set<String> EXCLUDE_PATHS = new HashSet<>(Arrays.asList( |
| | |
| | | String method = request.getMethod(); |
| | | String body = extractBody(request.getContentAsByteArray(), request.getContentType()); |
| | | |
| | | log.info(">>> [{}] {} {}{} | body={}", |
| | | traceId, |
| | | method, |
| | | uri, |
| | | query != null ? "?" + query : "", |
| | | body); |
| | | if (logHeaderProperties.isEnabled()) { |
| | | String headers = extractHeaders(request); |
| | | log.info(">>> [{}] {} {}{} | headers={} | body={}", |
| | | traceId, method, uri, |
| | | query != null ? "?" + query : "", |
| | | headers, body); |
| | | } else { |
| | | log.info(">>> [{}] {} {}{} | body={}", |
| | | traceId, method, uri, |
| | | query != null ? "?" + query : "", |
| | | body); |
| | | } |
| | | } |
| | | |
| | | private String extractHeaders(HttpServletRequest request) { |
| | | List<String> names = logHeaderProperties.getNames(); |
| | | StringBuilder sb = new StringBuilder("{"); |
| | | boolean first = true; |
| | | if (names != null && !names.isEmpty()) { |
| | | // 只打印配置的请求头 |
| | | for (String name : names) { |
| | | String value = request.getHeader(name); |
| | | if (value != null) { |
| | | if (!first) sb.append(", "); |
| | | first = false; |
| | | sb.append(name).append("=").append(value); |
| | | } |
| | | } |
| | | } else { |
| | | // 未配置则打印全部请求头 |
| | | Enumeration<String> headerNames = request.getHeaderNames(); |
| | | while (headerNames != null && headerNames.hasMoreElements()) { |
| | | String name = headerNames.nextElement(); |
| | | String value = request.getHeader(name); |
| | | if (!first) sb.append(", "); |
| | | first = false; |
| | | sb.append(name).append("=").append(value); |
| | | } |
| | | } |
| | | return sb.append("}").toString(); |
| | | } |
| | | |
| | | private void logResponse(ContentCachingResponseWrapper response, long cost) { |