简体   繁体   English

如何在Jetty 8中添加请求日志记录过滤器?

[英]How to add a request logging filter in Jetty 8?

Here is how I setup my Jetty server: 以下是我设置Jetty服务器的方法:

Server server = new Server(80);
server.setStopAtShutdown(true);

ServletHandler servletHandler = new ServletHandler();
servletHandler.addServletWithMapping(Erreur500Servlet.class, "/generate-error-500");
servletHandler.addServletWithMapping(AresServlet.class, "/ares/*");
servletHandler.addFilterWithMapping(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));

server.setHandler(servletHandler);
server.start(); // at com.company.MyPoc.init(MyPoc.java:44)
server.join();

However, when it starts, I got the following exception: 但是,当它启动时,我得到以下异常:

2015-10-20 12:53:07,565 (?:?) [WARN] FAILED com.company.filter.RequestLoggingFilter-896472140: java.lang.NullPointerException 
java.lang.NullPointerException: null
    at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:100) ~[jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:753) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.servlet.ServletHandler.doStart(ServletHandler.java:183) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.server.Server.doStart(Server.java:262) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908]
    at com.company.MyPoc.init(MyPoc.java:44) 

What am I missing? 我错过了什么?

Jetty 8.0.1.v20110908 Jetty 8.0.1.v20110908

First, and most important, Jetty 8 is EOL (End of Life) . 首先,最重要的是, Jetty 8是EOL(End of Life)

Next, please use a more recent version of Jetty, Jetty 8.0.1 is (currently) about 110 releases behind the current stable version of Jetty. 接下来,请使用更新版本的Jetty,Jetty 8.0.1(目前)是当前稳定版Jetty的110个版本。

Now, to explain what's going on. 现在,来解释发生了什么。

You are using ServletHandler directly, that's an internal class not meant to be instantiated and accessed directly but under the most simplistic and naive of situations. 您正在直接使用ServletHandler,这是一个内部类,不是要实例化和直接访问,而是在最简单和最天真的情况下。 Namely a Server with exactly 1 (and only 1) Servlet, no filters, no security, no session handling, etc... 即服务器只有1(只有1)Servlet,没有过滤器,没有安全性,没有会话处理等...

Use the ServletContextHandler and add your servlets and filters to it. 使用ServletContextHandler并将servlet和过滤器添加到它。 This is the proper way, as it establishes a ServletContext that all of your related Servlets and Filters use to coordinate with. 这是正确的方法,因为它建立了一个ServletContext ,所有相关的Servlet和过滤器都用来协调。

Example (this is done from memory, as Jetty 8.0.1 is so old, this may need some tweaking to work properly on your ancient version of Jetty) : 示例(这是从内存中完成的,因为Jetty 8.0.1太旧了,这可能需要一些调整才能在您古老的Jetty版本上正常工作)

Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.setResourceBase("/path/to/my/static/resources/");
context.setHandler(server);

context.addServlet(Erreur500Servlet.class, "/generate-error-500");
context.addServlet(AresServlet.class, "/ares/*");
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addServlet(DefaultServlet.class, "/");

server.start();
server.join();

Of note: 值得注意的是

  • If you have static resources to serve (html, javascript, css, images, etc..) then set the base resource path with .setResourceBase(String) (a new, and better, .setBaseResource(Resource) was added in Jetty 9) 如果您有静态资源(html,javascript,css,images等),则使用.setResourceBase(String)设置基本资源路径.setResourceBase(String)在Jetty 9中添加了一个新的,更好的.setBaseResource(Resource)
  • If you want to serve static resources or get error handling don't forget to call context.addServlet(DefaultServlet.class, "/") 如果要提供静态资源或获取错误处理,请不要忘记调用context.addServlet(DefaultServlet.class, "/")

If you want custom error handling, use the ServletContextHandler ErrorHandler features like this 如果您想要自定义错误处理,请使用这样的ServletContextHandler ErrorHandler功能

// Default error handler
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(500,"/error");

// Your webapp
ServletContextHandler context = new ServletContextHandler();
context.setErrorHandler(errorHandler);
context.addServlet(MyCustomErrorServlet.class, "/error");
// etc ...

Also of note, Jetty ships with a RequestLogHandler , which does the same end goal (but using a Jetty Handler, not via a Filter). 另外值得注意的是,Jetty附带了一个RequestLogHandler ,它具有相同的最终目标(但使用Jetty Handler,而不是通过Filter)。

Here is the solution I came up with: 这是我提出的解决方案:

Server server = new Server(80);
server.setStopAtShutdown(true);

ServletContextHandler context = new ServletContextHandler();
context.addServlet(Erreur500Servlet.class, "/generate-error-500");
context.addServlet(AresServlet.class, "/ares/*");
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));

server.setHandler(context);
server.start();
server.join();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM