Servlets jetty服务器日志请求主体

Servlets jetty服务器日志请求主体,servlets,jackson,jetty,Servlets,Jackson,Jetty,Slf4jRequestLog只记录请求方法、url和日期以及写入的响应状态代码和字节。 我一定要记录我的PUT/POST请求的正文。 我从Slf4jRequestLog派生了CustomSlf4jRequestLog,并尝试: RequestLogHandler requestLogHandler = new RequestLogHandler(); Slf4jRequestLog requestLog = new CustomSlf4jRequestLog(); requestLogHand

Slf4jRequestLog只记录请求方法、url和日期以及写入的响应状态代码和字节。 我一定要记录我的PUT/POST请求的正文。 我从Slf4jRequestLog派生了CustomSlf4jRequestLog,并尝试:

RequestLogHandler requestLogHandler = new RequestLogHandler();
Slf4jRequestLog requestLog = new CustomSlf4jRequestLog();
requestLogHandler.setRequestLog(requestLog);
不幸的是没有正文被打印出来,因为它已经被处理程序处理了

有可能在这里得到请求的主体吗


(我真的很关心body,因为我有JsonProvider,我想在Json解析数据失败时看到整个请求体)或者当我的应用程序失败时,我想看看是什么导致了这一点,而不必为每个输入请求添加日志记录。

Servlet规范妨碍了您

正在处理请求的实际servlet已经读取了请求正文,从
request.getInputStream()
读取的进一步内容无效(您处于EOF)

如果您想捕获请求主体,您需要创建一个自定义Servlet
过滤器
,然后包装
HttpServletRequest
,用自己的实现覆盖
getInputStream()
getReader()
方法,这些实现生成所读取数据的副本

然后由您决定要对请求正文内容的副本执行什么操作


您可以使用像Wireshark这样的网络捕获实用程序来查看请求主体是什么。即使您使用HTTPS,您也可以使用服务器证书配置Wireshark来检查加密的对话。

Servlet规范妨碍了您

正在处理请求的实际servlet已经读取了请求正文,从
request.getInputStream()
读取的进一步内容无效(您处于EOF)

如果您想捕获请求主体,您需要创建一个自定义Servlet
过滤器
,然后包装
HttpServletRequest
,用自己的实现覆盖
getInputStream()
getReader()
方法,这些实现生成所读取数据的副本

然后由您决定要对请求正文内容的副本执行什么操作


您可以使用像Wireshark这样的网络捕获实用程序来查看请求主体是什么。即使使用HTTPS,您也可以使用服务器证书配置Wireshark以检查加密的对话。

记录器再次在同一请求上调用getInputStream()。不允许您读取同一数据两次。您应该创建一个ServletRequestWrapper来复制请求主体

记录器再次对同一请求调用getInputStream()。不允许您读取同一数据两次。您应该创建一个ServletRequestWrapper来复制请求主体

public void log(Request request, Response response) {
        StringBuilder sb = new StringBuilder("RequestBody: ");
        try {
            LOG.info("BODY SIZE: " + request.getContentLength());
            BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            LOG.info(sb.toString());