jetty服务器日志请求正文

时间:2016-04-25 14:18:30

标签: servlets jackson jetty

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无法解析数据时看到整个请求)或者当我的应用程序失败时,我想看看是什么导致了这一点而没有为每个输入请求添加日志记录。

2 个答案:

答案 0 :(得分:0)

Servlet规范妨碍了你。

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

如果要捕获请求正文,则需要创建自定义Servlet Filter,然后包装HttpServletRequest,覆盖getInputStream() AND getReader()方法,您自己的实现可以复制已读取的数据。

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

您可以使用Wireshark等网络捕获实用程序来查看请求正文。即使您使用HTTPS,也可以使用服务器证书配置Wireshark以检查加密对话。

答案 1 :(得分:0)

记录器再次对同一请求调用 getInputStream()。您不能两次读取相同的数据。 Yo应该创建一个 ServletRequestWrapper 来制作请求正文的副本。