log所有响应和请求spring webflux

enyaitl3  于 2023-04-19  发布在  Spring
关注(0)|答案(1)|浏览(176)

我想在我的项目中添加日志,我使用webFilter来添加日志。我想记录请求头(除了认证头),请求方法和响应代码我将以下代码添加到我的项目中:

@Component
@Slf4j
public class LogFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange,
                             WebFilterChain webFilterChain) {
        log.info("log :: requestId: {}, ip: {}, method: {},path :{}, headers: {}, response :{}",
                serverWebExchange.getRequest().getId(), serverWebExchange.getRequest().getRemoteAddress(),
                serverWebExchange.getRequest().getMethod(), serverWebExchange.getRequest().getPath(),
                serverWebExchange.getRequest().getHeaders().entrySet()
                        .stream().filter(stringListEntry -> !stringListEntry.getKey().equals("Authorization")).toList(),
                serverWebExchange.getResponse().getStatusCode);
        return webFilterChain.filter(serverWebExchange);
    }

我有所有标题和需要的信息记录,但响应代码总是200 OK,但有些时候响应结果是400。

x3naxklr

x3naxklr1#

您的解决方案不正确,因为您在过滤器之前使用了日志记录器,如果有人订阅了它,过滤器将被触发,因此Mono/Fluw流链将稍后运行,而不是其他代码。您的控制器尚未运行,因此您过早地阅读了响应代码。请在以后使用调试模式并检查哪个调用将首先运行。
在我的解决方案中,我在等待通信结束。它可能是完整的或错误的。所以,我观察这些信号,并将记录其中之一。
一个解决方案:

@Component
public class LogFilter implements WebFilter {
    Logger log = LoggerFactory.getLogger(LogFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(exchange)
            .doOnEach(signal -> {
                if (signal.isOnComplete() || signal.isOnError()) {
                    log.info(
                        "log :: requestId: {}, ip: {}, method: {},path :{}, headers: {}, response :{}",
                        exchange.getRequest().getId(), exchange.getRequest().getRemoteAddress(),
                        exchange.getRequest().getMethod(), exchange.getRequest().getPath(),
                        exchange.getRequest().getHeaders().entrySet()
                                .stream().filter(stringListEntry -> !stringListEntry.getKey().equals("Authorization")).toList(),
                        exchange.getResponse().getStatusCode()
                    );
                }
            });
    }
}

相关问题