RequestLogHandler requestLogHandler = new RequestLogHandler();
Slf4jRequestLog requestLog = new CustomSlf4jRequestLog();
requestLogHandler.setRequestLog(requestLog);
Slf4jRequestLog仅记录请求方法,url和日期,以及写入的响应状态代码和字节。 我肯定想记录我的PUT / POST请求的正文。 我从Slf4jRequestLog派生了CustomSlf4jRequestLog,我尝试了:
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());
不幸的是没有正文被打印出来,因为它已经被处理程序处理了?
是否有可能在此处获得请求?
(我真的很在乎身体,因为我有JsonProvider,我希望在Json无法解析数据时看到整个请求)或者当我的应用程序失败时,我想看看是什么导致了这一点而没有为每个输入请求添加日志记录。
答案 0 :(得分:0)
Servlet规范妨碍了你。
正在处理请求的实际servlet已经读取了请求正文,因此request.getInputStream()
的进一步读取无效(您在EOF处)
如果要捕获请求正文,则需要创建自定义Servlet Filter
,然后包装HttpServletRequest
,覆盖getInputStream()
AND getReader()
方法,您自己的实现可以复制已读取的数据。
然后由您决定要对请求正文内容的副本执行什么操作。
或
您可以使用Wireshark等网络捕获实用程序来查看请求正文。即使您使用HTTPS,也可以使用服务器证书配置Wireshark以检查加密对话。
答案 1 :(得分:0)
记录器再次对同一请求调用 getInputStream()。您不能两次读取相同的数据。 Yo应该创建一个 ServletRequestWrapper 来制作请求正文的副本。