【问题标题】:NPE while using Custom Logging in Jetty 10/11在 Jetty 10/11 中使用自定义日志时的 NPE
【发布时间】:2021-10-21 10:19:42
【问题描述】:

我正在 Jetty11 中实现自定义日志记录,并在从请求对象中获取任何内容时获取以下代码的空指针异常。 我知道原因,但没有解决方案。原因是:在设置之前调用请求对象的方法。 我知道,应该有另一种方法来做到这一点。 我的用例是将 int 和 string 属性设置为记录器。在这个例子中,我调用 request.getMethod() 但我也必须调用其他方法

import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;

    public class JettyCustomLogger extends CustomRequestLog
    {
        private static Request request;
    
        @Override
        public void log(Request request, Response response)
        {
            this.request = request;
            super.log(request, response);
        }
    
        public JettyCustomLogger(Writer writer, String logStr)
        {
            super(writer, setCustomAttributesToLog(logStr));
        }
    
        private static String setCustomAttributesToLog(String logStr)
        {
    
            String method = request.getMethod();
            StringBuilder logBuffer = new StringBuilder(logStr);
            logBuffer.append(method);
            logBuffer.append("Ashish");
            logBuffer.append(" ");
            logBuffer.append("Goyanka");
            logBuffer.append(" ");
            logBuffer.append("absgdh");
            logBuffer.append(" ");
    
            return logBuffer.toString();
        }
    
    }

注意:如果我不调用请求对象方法,此代码可以正常工作。

更新:创建 setCustomAttributesToLog() 的原因是我需要在运行时从其他方法中获取字符串参数,但在这里,为了代码可读性,我给出了硬编码字符串

【问题讨论】:

    标签: java eclipse jetty application-server jetty-10


    【解决方案1】:

    每个请求响应对都会调用log(request, response) 方法,该方法预计会生成一些格式化的日志字符串,然后将其提供给RequestLogWriter。您不应该在构造函数中使用setCustomAttributesToLog(),因为还没有请求,并且您不应该将请求存储为静态字段。您根据请求生成日志字符串的所有转换逻辑都必须在log() 方法中完成。

    对于您当前的实现,您应该没有理由不能使用标准 CustomRequestLog。如果你阅读这个类的 javadoc,就会有格式字符串的概念。格式字符串是通用的,需要用来自实际请求/响应的信息替换 % 代码。

    要在这里实现您想要实现的目标,您可以执行类似的操作

    CustomRequestLog requestLog = new CustomRequestLog(writer, "%m Ashnish Goyanka absgdh ")
    

    然后对于每个请求,%m 将被替换为请求方法,然后这个字符串将被提供给作者。


    如果您不想使用CustomRequestLog 的格式字符串功能,我建议您直接实现RequestLog 接口,而不是扩展CustomRequestLog

    【讨论】:

    • 我不明白这一点 - 你所有的逻辑转换生成基于请求的日志字符串必须在 log() 方法中完成 - 我不能这样做,因为我们没有 Writer writer, String logStr objects in the log(request, response) 方法。如果可能的话,你能解释一下吗?
    • 只需将 Writer 保存为构造函数中的字段即可。您无法在构造函数中记录请求,因为没有要记录的请求。记录的请求/响应对在 log() 方法中提供给您。
    • CustomRequestLog上其实有一个getWriter()方法,你可以调用它来获取Writer,所以你不需要自己保存为字段。
    猜你喜欢
    • 2021-11-05
    • 2021-10-30
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多