嵌入式 Jetty(访问)请求记录
Embedded Jetty (Access) Request Logging
我正在使用 JAX-RS 和嵌入式 Jetty.I 创建一些 rest API 通过在 Server.java 文件中添加 LogRequestHandler 来启用服务器日志记录。
问题是为什么 jetty 为每个请求写入 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();
}
按以下顺序重新安排处理程序来解决此问题
我将资源处理程序设置为请求日志的处理程序(即它是外部处理程序),然后将请求日志处理程序添加到主码头处理程序。然后请求将转到请求日志 -> 处理程序 -> 请求日志并返回到 jetty
更新答案
不要使用 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);
我正在使用 JAX-RS 和嵌入式 Jetty.I 创建一些 rest API 通过在 Server.java 文件中添加 LogRequestHandler 来启用服务器日志记录。
问题是为什么 jetty 为每个请求写入 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();
}
按以下顺序重新安排处理程序来解决此问题
我将资源处理程序设置为请求日志的处理程序(即它是外部处理程序),然后将请求日志处理程序添加到主码头处理程序。然后请求将转到请求日志 -> 处理程序 -> 请求日志并返回到 jetty
更新答案
不要使用 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);