Logging Requests and Responses in Spring Boot
When developing REST APIs with Spring Boot, logging requests and responses can be crucial for debugging purposes and gaining insights into application behavior. This includes logging not only successful requests but also exceptions encountered.
Using Spring Boot Actuator
The Spring Boot Actuator module provides a built-in HTTP request logging feature. To enable request logging, follow these steps:
Customizing Request Logging
Customizing the request logging behavior can be achieved by implementing a WebFilter. This allows you to intercept and manipulate requests before they are handled by your application's controllers. Here's an example of a custom web filter that logs requests and responses:
public class RequestResponseLoggingFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { // Log the request logRequest(exchange); // Log the response return chain.filter(exchange).then(logResponse(exchange)); } private void logRequest(ServerWebExchange exchange) { String path = exchange.getRequest().getPath().toString(); String method = exchange.getRequest().getMethodValue(); String clientIp = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress(); String queryString = exchange.getRequest().getQueryParams().toString(); // ... (additional request information) } private Mono<Void> logResponse(ServerWebExchange exchange) { return exchange.getResponse().writeWith(processor -> { // ... (read the response, log the status code, response headers, etc.) }); } }
Register the filter in your Spring Boot application using WebFilterRegistrationBean:
@Bean public WebFilterRegistrationBean<RequestResponseLoggingFilter> requestResponseLoggingFilter() { return new WebFilterRegistrationBean<>(new RequestResponseLoggingFilter()); }
Handling Exceptions
To handle and log exceptions uniformly, you can use the @ExceptionHandler annotation on a controller or service class. For example:
@RestController public class MyController { @ExceptionHandler(Exception.class) public ResponseEntity<Error> handleException(Exception e) { // Log the exception // ... // Return the error response Error error = new Error(); error.setMessage(e.getMessage()); error.setErrorCode(101); // Custom error code return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error); } }
By combining the custom web filter with the exception handler, you can log all requests, responses, and exceptions in a consistent manner.
The above is the detailed content of How Can I Effectively Log Requests, Responses, and Exceptions in My Spring Boot REST API?. For more information, please follow other related articles on the PHP Chinese website!