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