加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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;
    }

}

“`

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读