• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Filter의 로그가 출력되지 않습니다.

24.01.29 13:38 작성 조회수 142

0

gateway에 의해서 api는 정상적으로 호출이 되는데 로그가 출력되지 않습니다.
customFilter, globalFilter 모두 출력이 되지 않았습니다. 코드에 혹시 누락된 부분이 있을까요.

Global Filter

package com.example.springgateway.filter;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
    public GlobalFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // Custom Pre Filter
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();

            log.info("Global Filter baseMessage : {}", config.getBaesMessage());
            if (config.isPreLogger()) {
                log.info("Global Filter Start : request id -> {}", request.getId());
            } else {
                log.info("preLogger is false");
            }

            // Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(()-> {
                if (config.isPostLogger()) {
                    log.info("Global Filter End : request id -> {}", response.getStatusCode());
                } else {
                    log.info("postLogger is false");
                }
            }));
        };
    }
    @Data
    public static class Config {
        //put the configuration properties
        private String baesMessage;
        private boolean preLogger;
        private boolean postLogger;
    }
}

 

application.yml

spring:
  application:
    name: gateway-service

  cloud:
    gateway:
      routes:
        - id: first-service
          uri: http://localhost:8081/
          predicates:
            - Path=/first-service/**
          filters:
            - CustomFilter

        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
            - CustomFilter
#            - AddRequestHeader=second-request, second-request-header2
#            - AddResponseHeader=second-response, second-response-header2

        - id: user-service
          uri: http://localhost:8083/
          predicates:
            - Path=/user-service/**
          filters:
            - CustomFilter
#          filters:
#            - AddRequestHeader=user-request, user-request-header2
#            - AddResponseHeader=user-response, user-response-header2

        - id: catalog-service
          uri: lb://CATALOG-SERVICE
          predicates:
            - Path=/catalog-service/**

        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/order-service/**
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway Global Filter
            preLogger: true
            postLogger: true


eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

server:
  port: 8000

 

Filter Config

package com.example.springgateway.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class FilterConfig {

//    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/user-service/**")
                        .filters(f -> f.addRequestHeader("user-request", "user-request-header")
                                .addResponseHeader("user-response", "user-response-header"))
                        .uri("http://localhost:8083/"))
                .route(r -> r.path("/second-service/**")
                        .filters(f -> f.addRequestHeader("second-request", "second-request-header")
                                .addResponseHeader("second-response", "second-response-header"))
                        .uri("http://localhost:8082/"))
                .build();
    }
}

 

Postman 실행 결과

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.31

안녕하세요, 인프런 AI 인턴입니다.

코딩하는대학생님, 로그가 출력되지 않는 문제를 겪고 계신 상황이군요. 제공해주신 정보를 바탕으로 몇 가지 확인해볼 포인트를 말씀드리겠습니다.

  1. 로깅 레벨 확인: application.yml 파일에서 로깅 레벨이 어떻게 설정되어 있는지 확인해야 합니다. 예를 들어, 로깅 레벨이 INFO 이상으로 설정되어야 해당 로그들이 출력됩니다.
  2. Slf4j 설정 확인: 로그를 사용하기 위해서는 Slf4j와 같은 로깅 프레임워크가 올바르게 설정되어 있어야 합니다. log.info 메서드를 사용하고 계시니, Slf4j 및 Logback과 같은 구현체가 클래스패스에 있고 올바르게 설정되어 있는지 확인하시기 바랍니다.
  3. 필터 동작 확인: CustomFilter 또는 GlobalFilter가 올바르게 작성되었음에도 불구하고, 또 다른 필터에 의해 요청 처리가 중단되거나 변경되는 경우가 있을 수 있으니, 이 부분을 검토해 보세요.
  4. 스프링 부트 기본 로그 출력 형식: 스프링 부트의 기본 로그 출력 형식을 참고하여 조건에 맞는 로그가 출력되는지 확인합니다. 스프링 부트의 기본 로그에는 날짜와 시간, 로그 레벨, 프로세스 ID, 구분자, 스레드 이름, 로거 이름(소스 클래스 이름), 로그 메시지가 포함됩니다. 이는 Spring Boot Reference Documentation v3.1.5에서도 확인할 수 있습니다.

해당 필터 구성이 올바른지 확인하시고, 로깅 설정 및 레벨, 필터의 추가와 적용 등이 올바르게 설정되어 있는지 다시 한 번 점검해 보시기 바랍니다.

또한, 로그가 출력되지 않는 원인을 좀 더 자세히 파악하기 위해, 실제 로깅 동작을 거치는 컨테이너나 서버의 로그 설정 파일도 점검해보시는 것이 좋을 것 같습니다.

위의 조언들이 문제 해결에 도움이 되길 바랍니다. 추가적인 도움이 필요하거나, 다른 문제가 발생하면 언제든 질문해 주세요.