gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:37:32 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com