scala - play 2.6.x 记录请求体和处理时间

标签 scala playframework

我正在使用 Play 服务器 2.6.x 并尝试记录每个请求的请求正文和处理时间。

问题是,如果我使用 Play Filter api 我无权访问请求正文,如果我正在使用 Play Action api 将操作包装为 LoggingAction我可以访问正文但没有响应时间,所以我必须同时使用它们并为每个请求创建一个唯一的 id,并按请求 id 更新日志。

在我看来,必须有更优雅的解决方案。

最佳答案

有同样的问题 - 找到答案并不是一件容易的事 - 看看 play.test.Helpers 类 - 你有实现它的方法。

使用哪一个取决于您是否有权访问 Materializer 和/或您在哪里/如何做日志。如果它是一个过滤器或一个 Action 。

就我而言,我将其用作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;
    }

}

``

关于scala - play 2.6.x 记录请求体和处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45569773/

相关文章:

playframework - 与 websocket 连接时使用 akka-stream-kafka 从 kafka Topic 获取最后一条消息

scala - Scala 中的 protected 函数

scala - 为什么 scala 找不到 sbt 能找到的东西?

scala - 在 HDFS 上预组合表并在 Spark 中读取零混洗

scala - 如何在 Gatling 中动态生成 JSon?

playframework - Play2 中的异步输入验证器

playframework - 在 Play 应用程序中禁用延迟加载

scala - 为 Scala 2.12(Play Framework)添加 Flyway-sbt 插件时出错

scala - 为什么 AnyVal 不能用于 isInstanceOf 检查?

scala - 更强大的 getOrElse?