scala – 播放2.6.x记录请求正文和处理时间
发布时间:2020-12-16 18:29:13 所属栏目:安全 来源:网络整理
导读:我正在使用播放服务器2.6.x并尝试记录请求正文和每个请求的处理时间. 问题是,如果我正在使用Play Filter api,我无法访问请求正文,如果我正在使用Play Action api将动作包装为LoggingAction,我可以访问正文但无法获得响应时间,所以我不得不同时使用它们并为每
我正在使用播放服务器2.6.x并尝试记录请求正文和每个请求的处理时间.
问题是,如果我正在使用Play Filter api,我无法访问请求正文,如果我正在使用Play Action api将动作包装为LoggingAction,我可以访问正文但无法获得响应时间,所以我不得不同时使用它们并为每个请求创建一个唯一的id,并按请求ID更新日志. 在我看来,必须有更优雅的解决方案. 解决方法
有同样的问题 – 找到答案并非易事 – 看一下play.test.Helpers类 – 你有方法可以实现那个目标.
使用哪一个将取决于您是否有权访问Materializer和/或您在何处/如何进行日志.如果它是过滤器或动作. 就我而言,我将它用作Action,并且符合我类似要求的代码是: @Override public CompletionStage<Result> call(Http.Context context) { if(environment.isProd()) { //let's just not log anything delegate.call(context); } CompletionStage<Result> callResult = null; try { Http.RequestBody body = context.request().body(); final String basicCallIdentifier = "Call: " + context.request().method() + ":" + context.request().uri(); String requestMessage = "Request - " + basicCallIdentifier; if(body != null) { requestMessage += " body: " + body.asText(); } LOG.debug(requestMessage); callResult = delegate.call(context); return callResult.whenComplete((result,throwable) -> { String resultMessage = "Response - " + basicCallIdentifier + ":"; if(result == null) { resultMessage += " Null result!"; LOG.debug(resultMessage,throwable); } else { resultMessage += " Status: " +result.status(); HttpEntity resultBody = result.body(); if(resultBody != null && resultBody.contentType().isPresent() && resultBody.contentType().get().contains("json")) { HttpEntity.Strict resultBodyStrict = (HttpEntity.Strict) resultBody; ByteString byteString = resultBodyStrict.data(); resultMessage += " body: " + byteString.decodeString("UTF-8"); } LOG.debug(resultMessage,throwable); } }); } catch(Exception ex) { LOG.error("Caught exception on APILogAction",ex); if(callResult == null) { callResult = delegate.call(context); } return callResult; } } “` (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读