Skip to content

Commit

Permalink
Adding requestlog demo
Browse files Browse the repository at this point in the history
  • Loading branch information
joakime committed Feb 2, 2024
1 parent c3ae5f1 commit ba26baf
Show file tree
Hide file tree
Showing 7 changed files with 349 additions and 0 deletions.
1 change: 1 addition & 0 deletions embedded/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<module>http-config</module>
<module>jndi</module>
<module>redirect</module>
<module>requestlog</module>
<module>rewrite</module>
<module>simple-server</module>
<module>virtual-hosts</module>
Expand Down
33 changes: 33 additions & 0 deletions embedded/requestlog/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.eclipse.jetty.examples.embedded</groupId>
<artifactId>jetty-embedded-examples</artifactId>
<version>12.0.x</version>
</parent>
<artifactId>requestlog</artifactId>
<version>12.0.x</version>
<packaging>jar</packaging>
<name>Jetty Examples :: Jetty 12.0.x :: Embedded :: Request Logging</name>

<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-slf4j-impl</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<version>${jetty-test-helper.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package examples;

import java.nio.file.Files;
import java.nio.file.Path;

import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.Content;
import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.Callback;

public class RequestLogToFileDemo
{
public static void main(String[] args) throws Exception
{
Path logsDir = Path.of("target/logs");
if (!Files.isDirectory(logsDir))
Files.createDirectories(logsDir);

Server server = RequestLogToFileDemo.newServer(8080, logsDir);
server.start();
server.join();
}

public static Server newServer(int port, Path logsDir)
{
Server server = new Server(port);

Handler.Sequence handlers = new Handler.Sequence();
server.setHandler(handlers);
handlers.addHandler(new Handler.Abstract()
{
@Override
public boolean handle(Request request, Response response, Callback callback) throws Exception
{
if (request.getHttpURI().getPath().startsWith("/bogus"))
Response.writeError(request, response, callback, HttpStatus.NOT_FOUND_404);
else
{
response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8");
Content.Sink.write(response, true, "Hello from " + RequestLogToFileDemo.class.getName(), callback);
}
return true;
}
});

AsyncRequestLogWriter requestLogWriter = new AsyncRequestLogWriter();
requestLogWriter.setAppend(true);
requestLogWriter.setFilename(logsDir.resolve("request.log").toString());
requestLogWriter.setRetainDays(1);
RequestLog requestLog = new CustomRequestLog(requestLogWriter, CustomRequestLog.EXTENDED_NCSA_FORMAT);
server.setRequestLog(requestLog);

return server;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package examples;

import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.Content;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Slf4jRequestLogWriter;
import org.eclipse.jetty.util.Callback;

public class RequestLogToSlf4jDemo
{
public static void main(String[] args) throws Exception
{
Server server = RequestLogToSlf4jDemo.newServer(8080);
server.start();
server.join();
}

public static Server newServer(int port)
{
Server server = new Server(port);

Handler.Sequence handlers = new Handler.Sequence();
server.setHandler(handlers);
handlers.addHandler(new Handler.Abstract()
{
@Override
public boolean handle(Request request, Response response, Callback callback) throws Exception
{
if (request.getHttpURI().getPath().startsWith("/bogus"))
Response.writeError(request, response, callback, HttpStatus.NOT_FOUND_404);
else
{
response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain; charset=utf-8");
Content.Sink.write(response, true, "Hello from " + RequestLogToSlf4jDemo.class.getName(), callback);
}
return true;
}
});

Slf4jRequestLogWriter requestLoggingWriter = new Slf4jRequestLogWriter();
requestLoggingWriter.setLoggerName("examples.requests");
RequestLog requestLog = new CustomRequestLog(requestLoggingWriter, CustomRequestLog.EXTENDED_NCSA_FORMAT);
server.setRequestLog(requestLog);

return server;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
org.eclipse.jetty.logging.appender.NAME_CONDENSE=false
org.eclipse.jetty.LEVEL=INFO
examples.LEVEL=INFO
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package examples;

import java.io.IOException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.MavenPaths;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.is;

public class RequestLogToFileDemoTest
{
private static final Logger LOG = LoggerFactory.getLogger(RequestLogToFileDemoTest.class);
private Server server;
private Path logsDir;

@BeforeEach
public void startServer() throws Exception
{
logsDir = MavenPaths.targetTestDir(RequestLogToFileDemoTest.class.getSimpleName());
FS.ensureDirExists(logsDir);

server = RequestLogToFileDemo.newServer(0, logsDir);
server.start();
}

@AfterEach
public void stopServer()
{
LifeCycle.stop(server);
}

@Test
public void testRequests() throws IOException, InterruptedException
{
long fileSizeInitial = getActiveLogFileSize();
HttpClient client = HttpClient.newBuilder().build();

HttpRequest request = HttpRequest.newBuilder()
.uri(server.getURI().resolve("/interesting/dir"))
.version(HttpClient.Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
assertThat(response.statusCode(), is(200));

request = HttpRequest.newBuilder()
.uri(server.getURI().resolve("/bogus/path"))
.version(HttpClient.Version.HTTP_1_1)
.build();
response = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
assertThat(response.statusCode(), is(404));

long fileSizeNow = getActiveLogFileSize();
assertThat("Request Log should have grown in size", fileSizeNow, greaterThan(fileSizeInitial));
}

private long getActiveLogFileSize()
{
try
{
Path requestlog = logsDir.resolve("request.log");
if (Files.isRegularFile(requestlog))
return Files.size(requestlog);
return -1;
}
catch (IOException e)
{
LOG.warn("Unable to calculate log file size", e);
return -1;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
//
// ========================================================================
// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//

package examples;

import java.io.IOException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

public class RequestLogToSlf4jDemoTest
{
private static final Logger LOG = LoggerFactory.getLogger(RequestLogToSlf4jDemoTest.class);
private Server server;

@BeforeEach
public void startServer() throws Exception
{
LOG.warn("===== SEE Console Logging Output for \":INFO :examples.requests:\" entries =====");

server = RequestLogToSlf4jDemo.newServer(0);
server.start();
}

@AfterEach
public void stopServer()
{
LifeCycle.stop(server);
}

@Test
public void testRequests() throws IOException, InterruptedException
{
HttpClient client = HttpClient.newBuilder().build();

HttpRequest request = HttpRequest.newBuilder()
.uri(server.getURI().resolve("/interesting/dir"))
.version(HttpClient.Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
assertThat(response.statusCode(), is(200));

request = HttpRequest.newBuilder()
.uri(server.getURI().resolve("/bogus/path"))
.version(HttpClient.Version.HTTP_1_1)
.build();
response = client.send(request, HttpResponse.BodyHandlers.ofString(UTF_8));
assertThat(response.statusCode(), is(404));
}
}

0 comments on commit ba26baf

Please sign in to comment.