diff --git a/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/CustomServerLoggingFilter.java b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/CustomServerLoggingFilter.java new file mode 100644 index 000000000000..12821fade554 --- /dev/null +++ b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/CustomServerLoggingFilter.java @@ -0,0 +1,30 @@ +package com.baeldung.jersey.serverlogging; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.ext.Provider; + +@Provider +public class CustomServerLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter { + + private static final Logger LOG = LoggerFactory.getLogger(CustomServerLoggingFilter.class); + + @Override + public void filter(ContainerRequestContext requestContext) { + LOG.info("Incoming request: {} {}", requestContext.getMethod(), requestContext.getUriInfo() + .getRequestUri()); + LOG.info("Request headers: {}", requestContext.getHeaders()); + } + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { + LOG.info("Outgoing response: {} {} - Status {}", requestContext.getMethod(), requestContext.getUriInfo() + .getRequestUri(), responseContext.getStatus()); + LOG.info("Response headers: {}", responseContext.getHeaders()); + } +} diff --git a/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingApp.java b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingApp.java new file mode 100644 index 000000000000..4c9ecc52e59c --- /dev/null +++ b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingApp.java @@ -0,0 +1,22 @@ +package com.baeldung.jersey.serverlogging; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.glassfish.jersey.logging.LoggingFeature; +import org.glassfish.jersey.server.ResourceConfig; + +public class JerseyServerLoggingApp extends ResourceConfig { + + public JerseyServerLoggingApp() { + register(LoggingResource.class); + + register(new LoggingFeature( + Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME), + Level.INFO, + LoggingFeature.Verbosity.PAYLOAD_ANY, + 8192)); + + register(CustomServerLoggingFilter.class); + } +} diff --git a/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/LoggingResource.java b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/LoggingResource.java new file mode 100644 index 000000000000..36372404d52a --- /dev/null +++ b/web-modules/jersey-2/src/main/java/com/baeldung/jersey/serverlogging/LoggingResource.java @@ -0,0 +1,13 @@ +package com.baeldung.jersey.serverlogging; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Path("/logging") +public class LoggingResource { + + @GET + public String get() { + return "Hello"; + } +} diff --git a/web-modules/jersey-2/src/test/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingIntegrationTest.java b/web-modules/jersey-2/src/test/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingIntegrationTest.java new file mode 100644 index 000000000000..622fd07d7185 --- /dev/null +++ b/web-modules/jersey-2/src/test/java/com/baeldung/jersey/serverlogging/JerseyServerLoggingIntegrationTest.java @@ -0,0 +1,59 @@ +package com.baeldung.jersey.serverlogging; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.net.URI; + +import org.glassfish.grizzly.http.server.HttpServer; +import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.core.Response; + +class JerseyServerLoggingIntegrationTest { + + private static HttpServer server; + private static final URI BASE_URI = URI.create("http://localhost:8080/api"); + + @BeforeAll + static void setup() { + server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, new JerseyServerLoggingApp()); + } + + @AfterAll + static void teardown() { + server.shutdownNow(); + } + + @Test + void whenRequestMadeWithLoggingFilter_thenCustomLogsAreWritten() { + Logger logger = (Logger) LoggerFactory.getLogger(CustomServerLoggingFilter.class); + ListAppender listAppender = new ListAppender<>(); + listAppender.start(); + logger.addAppender(listAppender); + listAppender.list.clear(); + + Response response = ClientBuilder.newClient() + .target(BASE_URI + "/logging") + .request() + .get(); + assertEquals(200, response.getStatus()); + + boolean requestLogFound = listAppender.list.stream() + .anyMatch(event -> event.getFormattedMessage().contains("Incoming request: GET http://localhost:8080/api/logging")); + boolean responseLogFound = listAppender.list.stream() + .anyMatch(event -> event.getFormattedMessage().contains("Outgoing response: GET http://localhost:8080/api/logging - Status 200")); + + assertEquals(true, requestLogFound, "Request log not found"); + assertEquals(true, responseLogFound, "Response log not found"); + + logger.detachAppender(listAppender); + } +}