LogFilter.java
package se.jobtechdev.personaldatagateway.api.logging;
import jakarta.annotation.Nonnull;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import se.jobtechdev.personaldatagateway.api.util.LoggerSupplier;
import java.io.IOException;
@Component
public class LogFilter extends OncePerRequestFilter {
private final Logger log;
public LogFilter() {
log = LoggerSupplier.forClass(LogFilter.class).get();
}
public void doLog(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response) {
try {
Slf4jMdcUtil.addHttpFields(request, response);
Slf4jMdcUtil.addUrlFields(request);
Slf4jMdcUtil.addEventFields(request, response);
Slf4jMdcUtil.log(response, log); // Application log
if (Slf4jMdcUtil.activateAuditField()) {
Slf4jMdcUtil.addObjectFields(request, log);
Slf4jMdcUtil.log(response, log); // Audit log
}
} catch (Exception e) {
Slf4jMdcUtil.clearMdc();
log.error("Failed to log!");
} finally {
Slf4jMdcUtil.clearMdc();
}
}
@Override
protected void doFilterInternal(
@Nonnull HttpServletRequest request,
@Nonnull HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
final var requestWrapper = new ContentCachingRequestWrapper(request);
final var responseWrapper = new ContentCachingResponseWrapper(response);
filterChain.doFilter(requestWrapper, responseWrapper);
doLog(requestWrapper, responseWrapper);
responseWrapper.copyBodyToResponse();
}
}