【问题标题】:Embedded Jetty (Access) Request Logging嵌入式 Jetty(访问)请求日志记录
【发布时间】:2017-03-17 00:57:47
【问题描述】:

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

问题是为什么码头为每个请求写 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();
    }

【问题讨论】:

  • 发布您如何将 RequestHandler 添加到您的应用程序。它在处理程序树中的位置很重要。
  • RequestLogHandler requestLogHandler = new RequestLogHandler(); requestLogHandler.setRequestLog(requestLog); ServletContextHandler 上下文 = 新的 ServletContextHandler(ServletContextHandler.SESSIONS); context.addServlet(servlet, "/*"); server.addHandler()
  • 请编辑您的问题并添加代码,使其更易于阅读/搜索。
  • 已编辑。请注意,它为每个请求记录 200 个。

标签: jetty jersey-2.0


【解决方案1】:

更新答案

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

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

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

原答案

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

使用RequestLog 的理想方式是在服务器上设置它并且不使用RequestLogHandler ...

jettyServer.setRequestLog(requestLog);

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

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

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

requestLogHandler.setHandler(context);
jettyServer.setHandler(requestLogHandler);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多