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,它告诉工厂不要立即启动服务器。否则服务器的任何配置(在启动后)都不会影响行为。