Grizzly 服务器和 Jersey 的访问日志为空
Access log is empty with Grizzly server and Jersey
我无法让 Grizzly 服务器写入访问日志。
最简单的设置如下:
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.accesslog.AccessLogBuilder;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import java.net.URI;
import java.util.HashMap;
public class App {
public static void main(String[] args) throws Exception {
URI uri = new URI("http://localhost:12987/");
ResourceConfig rc = new ResourceConfig().registerClasses(Greeter.class);
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, rc);
new AccessLogBuilder("hi.access.log").instrument(server.getServerConfiguration());
server.start();
}
}
资源代码:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/")
public class Greeter {
@GET
@Path("hi")
public String hi() { return "hi!"; }
}
Gradle 包含依赖描述和版本的脚本:
buildscript {
ext.java_version = '1.8'
ext.jersey_version = '2.25.1'
repositories {
mavenCentral()
}
}
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile "javax.servlet:servlet-api:2.5"
compile "org.glassfish.jersey.core:jersey-server:$jersey_version"
compile "org.glassfish.jersey.containers:jersey-container-servlet-core:$jersey_version"
compile "org.glassfish.jersey.containers:jersey-container-grizzly2-http:$jersey_version"
}
我观察到一个意外行为,即访问日志文件是在服务器启动时创建的,但在发出请求时没有向其中写入任何内容。服务器发送响应并在其他方面工作正常。
我试图调试这个东西但没有帮助,因为 Jersey 依赖大量的反射和动态加载。我还尝试添加用于监视的属性,特别是 ServerProperties.MONITORING_ENABLED
但这并没有改变任何东西。
我应该添加或配置什么才能使访问日志正常工作?
事实证明,唯一需要改变的是
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, rc, false);
注意第三个参数false
,它告诉工厂不要立即启动服务器。否则服务器的任何配置(在启动后)都不会影响行为。
我无法让 Grizzly 服务器写入访问日志。
最简单的设置如下:
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.accesslog.AccessLogBuilder;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import java.net.URI;
import java.util.HashMap;
public class App {
public static void main(String[] args) throws Exception {
URI uri = new URI("http://localhost:12987/");
ResourceConfig rc = new ResourceConfig().registerClasses(Greeter.class);
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, rc);
new AccessLogBuilder("hi.access.log").instrument(server.getServerConfiguration());
server.start();
}
}
资源代码:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/")
public class Greeter {
@GET
@Path("hi")
public String hi() { return "hi!"; }
}
Gradle 包含依赖描述和版本的脚本:
buildscript {
ext.java_version = '1.8'
ext.jersey_version = '2.25.1'
repositories {
mavenCentral()
}
}
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile "javax.servlet:servlet-api:2.5"
compile "org.glassfish.jersey.core:jersey-server:$jersey_version"
compile "org.glassfish.jersey.containers:jersey-container-servlet-core:$jersey_version"
compile "org.glassfish.jersey.containers:jersey-container-grizzly2-http:$jersey_version"
}
我观察到一个意外行为,即访问日志文件是在服务器启动时创建的,但在发出请求时没有向其中写入任何内容。服务器发送响应并在其他方面工作正常。
我试图调试这个东西但没有帮助,因为 Jersey 依赖大量的反射和动态加载。我还尝试添加用于监视的属性,特别是 ServerProperties.MONITORING_ENABLED
但这并没有改变任何东西。
我应该添加或配置什么才能使访问日志正常工作?
事实证明,唯一需要改变的是
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, rc, false);
注意第三个参数false
,它告诉工厂不要立即启动服务器。否则服务器的任何配置(在启动后)都不会影响行为。