Skip to content

Commit e9631b6

Browse files
authored
BAEL-6681 Guide to Jersey Logging on Server (#18881)
* working * new line at EOF
1 parent af0998d commit e9631b6

File tree

4 files changed

+124
-0
lines changed

4 files changed

+124
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.jersey.serverlogging;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import jakarta.ws.rs.container.ContainerRequestContext;
7+
import jakarta.ws.rs.container.ContainerRequestFilter;
8+
import jakarta.ws.rs.container.ContainerResponseContext;
9+
import jakarta.ws.rs.container.ContainerResponseFilter;
10+
import jakarta.ws.rs.ext.Provider;
11+
12+
@Provider
13+
public class CustomServerLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {
14+
15+
private static final Logger LOG = LoggerFactory.getLogger(CustomServerLoggingFilter.class);
16+
17+
@Override
18+
public void filter(ContainerRequestContext requestContext) {
19+
LOG.info("Incoming request: {} {}", requestContext.getMethod(), requestContext.getUriInfo()
20+
.getRequestUri());
21+
LOG.info("Request headers: {}", requestContext.getHeaders());
22+
}
23+
24+
@Override
25+
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
26+
LOG.info("Outgoing response: {} {} - Status {}", requestContext.getMethod(), requestContext.getUriInfo()
27+
.getRequestUri(), responseContext.getStatus());
28+
LOG.info("Response headers: {}", responseContext.getHeaders());
29+
}
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.jersey.serverlogging;
2+
3+
import java.util.logging.Level;
4+
import java.util.logging.Logger;
5+
6+
import org.glassfish.jersey.logging.LoggingFeature;
7+
import org.glassfish.jersey.server.ResourceConfig;
8+
9+
public class JerseyServerLoggingApp extends ResourceConfig {
10+
11+
public JerseyServerLoggingApp() {
12+
register(LoggingResource.class);
13+
14+
register(new LoggingFeature(
15+
Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME),
16+
Level.INFO,
17+
LoggingFeature.Verbosity.PAYLOAD_ANY,
18+
8192));
19+
20+
register(CustomServerLoggingFilter.class);
21+
}
22+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.jersey.serverlogging;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
6+
@Path("/logging")
7+
public class LoggingResource {
8+
9+
@GET
10+
public String get() {
11+
return "Hello";
12+
}
13+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.baeldung.jersey.serverlogging;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.net.URI;
6+
7+
import org.glassfish.grizzly.http.server.HttpServer;
8+
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
9+
import org.junit.jupiter.api.AfterAll;
10+
import org.junit.jupiter.api.BeforeAll;
11+
import org.junit.jupiter.api.Test;
12+
import org.slf4j.LoggerFactory;
13+
14+
import ch.qos.logback.classic.Logger;
15+
import ch.qos.logback.classic.spi.ILoggingEvent;
16+
import ch.qos.logback.core.read.ListAppender;
17+
import jakarta.ws.rs.client.ClientBuilder;
18+
import jakarta.ws.rs.core.Response;
19+
20+
class JerseyServerLoggingIntegrationTest {
21+
22+
private static HttpServer server;
23+
private static final URI BASE_URI = URI.create("http://localhost:8080/api");
24+
25+
@BeforeAll
26+
static void setup() {
27+
server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, new JerseyServerLoggingApp());
28+
}
29+
30+
@AfterAll
31+
static void teardown() {
32+
server.shutdownNow();
33+
}
34+
35+
@Test
36+
void whenRequestMadeWithLoggingFilter_thenCustomLogsAreWritten() {
37+
Logger logger = (Logger) LoggerFactory.getLogger(CustomServerLoggingFilter.class);
38+
ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
39+
listAppender.start();
40+
logger.addAppender(listAppender);
41+
listAppender.list.clear();
42+
43+
Response response = ClientBuilder.newClient()
44+
.target(BASE_URI + "/logging")
45+
.request()
46+
.get();
47+
assertEquals(200, response.getStatus());
48+
49+
boolean requestLogFound = listAppender.list.stream()
50+
.anyMatch(event -> event.getFormattedMessage().contains("Incoming request: GET http://localhost:8080/api/logging"));
51+
boolean responseLogFound = listAppender.list.stream()
52+
.anyMatch(event -> event.getFormattedMessage().contains("Outgoing response: GET http://localhost:8080/api/logging - Status 200"));
53+
54+
assertEquals(true, requestLogFound, "Request log not found");
55+
assertEquals(true, responseLogFound, "Response log not found");
56+
57+
logger.detachAppender(listAppender);
58+
}
59+
}

0 commit comments

Comments
 (0)