嵌入式Jetty(访问)请求记录

Tah*_*Ali 5 jetty jersey-2.0

我正在使用JAX-RS和嵌入式Jetty创建一些rest API.我通过在Server.java文件中添加LogRequestHandler来启用Server日志记录.

问题是为什么码头为每个请求写200 0:0:0:0:0:0:0:1 - - [03/Nov/2016:16:59:57 +0500] "GET /app/check HTTP/1.1" 200 - 4

虽然检查终点未实现但在应用程序中不存在.

源代码:

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    //context.setContextPath("/");

    ResourceConfig config = new ResourceConfig();
    config.packages("server");
    ServletHolder servlet = new ServletHolder(new ServletContainer(config));
    context.addServlet(servlet,"/*");

    NCSARequestLog requestLog = new NCSARequestLog("/var/logs/jetty/log-yyyy_mm_dd.request.log");
    requestLog.setAppend(true);
    requestLog.setExtended(false);
    requestLog.setLogTimeZone("GMT+5");
    requestLog.setLogLatency(true);
    requestLog.setRetainDays(90);
    RequestLogHandler requestLogHandler = new RequestLogHandler();
    requestLogHandler.setRequestLog(requestLog);

    HandlerList topLevelHandlers = new HandlerList();
    topLevelHandlers.addHandler(context);
    topLevelHandlers.addHandler(requestLogHandler);

    try {
        jettyServer.setHandler(topLevelHandlers);
        jettyServer.dumpStdErr();
        jettyServer.start();
    }
Run Code Online (Sandbox Code Playgroud)

Joa*_*elt 5

更新答案

不要使用RequestLogHandler它,现已弃用。

RequestLog现在应该在方法上设置任何接口实现Server.setRequestLog(RequestLog)

这将捕获更多请求,甚至 400(错误请求)、解析失败的请求、不属于上下文的请求,甚至未分派到处理程序树的请求。

原答案

应该RequestLogHandler在跟踪任何上下文之前执行。

理想的使用方法RequestLog是在服务器上设置它而不是使用RequestLogHandler...

jettyServer.setRequestLog(requestLog);
Run Code Online (Sandbox Code Playgroud)

但是如果您需要将它用作处理程序,那么您应该确保它在您想要跟踪的任何上下文之前执行......

HandlerList topLevelHandlers = new HandlerList();
topLevelHandlers.addHandler(requestLogHandler);
topLevelHandlers.addHandler(context);
jettyServer.setHandler(topLevelHandlers);
Run Code Online (Sandbox Code Playgroud)

或者用请求日志处理程序包装上下文...

requestLogHandler.setHandler(context);
jettyServer.setHandler(requestLogHandler);
Run Code Online (Sandbox Code Playgroud)


Tah*_*Ali 2

通过按以下顺序重新排列处理程序来修复此问题

我将资源处理程序设置为请求日志的处理程序(即它是外部处理程序),然后将请求日志处理程序添加到主码头处理程序中。然后请求将转到请求日志 -> 处理程序 -> 请求日志并返回码头