提问人:Dhaval D 提问时间:11/9/2023 更新时间:11/9/2023 访问量:40
Quarkus:如何记录传入的 POST 请求的正文
Quarkus: How to log body of an incoming POST request
问:
我有一个使用依赖项的 Quakus 应用程序。即非反应性。quarkus-resteasy
我想打印(或以某种方式知道)传入的 POST 请求正文的内容。
我尝试了各种日志级别设置,如下所示:
quarkus.log.level=ALL
quarkus.log.category."io.quarkus.resteasy".level=DEBUG
quarkus.log.category."org.apache.http".level=TRACE
quarkus.http.access-log.enabled=true
quarkus.log.category."org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider".level=TRACE
quarkus.log.category."org.jboss.resteasy.plugins.providers.jackson".level=TRACE
我能得到的只是请求 URI 详细信息和响应代码详细信息。
我还实现了此处建议的日志记录过滤器。但那也印了空的身体。这是我的实现。
package com.crux.kiron.util.common;
import io.vertx.core.Future;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpServerRequest;
import org.jboss.logging.Logger;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;
@Provider
public class LoggingFilter implements ContainerRequestFilter {
private static final Logger LOG = Logger.getLogger(LoggingFilter.class);
@Context
UriInfo info;
@Context
HttpServerRequest request;
@Override
public void filter(ContainerRequestContext context) {
final String method = context.getMethod();
final String path = info.getPath();
final String address = request.remoteAddress().toString();
Future<Buffer> body = request.body();
body.onComplete(ar -> {
if (ar.failed()) {
/*...*/
} else {
LOG.info("Request body: " + ar.result());
}
});
LOG.info("Extralog "+method+" "+path+" "+address+" "+body);
}
}
如果有人能对此有所了解,我将不胜感激。它实际上应该像打开某个包的调试日志一样简单。但它似乎更复杂。
答:
2赞
forty-two
11/9/2023
#1
曾几何时,我通过在 ext 包中实现 ReaderInterceptor 接口来做到这一点。我记得(我不再有权访问源代码),我使用 ReaderInterceptorContext 对象上的 getInputStream() 方法消耗了正文(并且可以记录它),但是由于正文现在被消耗了,我不得不通过使用 setInputStream(...) 方法“将其设置回去”来恢复它,以允许下一个参与者读取正文。
我不知道这将如何与 vertx 一起玩。
在一般情况下,使用 HTTP 请求的正文是相当棘手的。它可能会永远持续下去,因此您必须小心应用此装饰器的资源。
评论