Как настроить Spring-Cloud-Gateway для использования сыщика для регистрации тела запроса / ответа

Я ищу сервер шлюза на основе spring-cloud-gateway: 2.0.2-RELEASE и хотел бы использовать сыщик для целей регистрации. У меня работает сыщик, так как, когда я пишу в журнал, я вижу детали сыщика (идентификатор диапазона и т. Д.), Но я надеюсь увидеть, что тело сообщений регистрируется автоматически. Есть ли что-то, что мне нужно сделать, чтобы Sleuth регистрировал запрос / ответ прямо из коробки с помощью Spring-Cloud-Gateway?

Вот заголовки запросов, которые поступают в мою подчиненную службу.


    headers:
       { 'x-request-foo': '2a9c5e36-2c0f-4ad3-926c-cb20d4428462',
         forwarded: 'proto=http;host=localhost;for="0:0:0:0:0:0:0:1:51720"',
         'x-forwarded-for': '0:0:0:0:0:0:0:1',
         'x-forwarded-proto': 'http',
         'x-forwarded-port': '80',
         'x-forwarded-host': 'localhost',
         'x-b3-traceid': '5bd33eb8050c7a32dfce6adfe68b06ca',
         'x-b3-spanid': 'ba202a6d6f3e2893',
         'x-b3-parentspanid': 'dfce6adfe68b06ca',
         'x-b3-sampled': '0',
         host: 'localhost:8080' },

Файл Gradle в сервисе шлюза ..


    buildscript {
        ext {
            kotlinVersion = '1.2.61'
            springBootVersion = '2.0.6.RELEASE'
            springCloudVersion = 'Finchley.RELEASE'
        }
    }
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-sleuth:2.0.2.RELEASE"
            mavenBom 'org.springframework.cloud:spring-cloud-gateway:2.0.2.RELEASE'
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
    dependencies {
        implementation('org.springframework.cloud:spring-cloud-starter-sleuth')
        implementation('org.springframework.cloud:spring-cloud-starter-gateway')
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        testImplementation('org.springframework.boot:spring-boot-starter-test')
    }

и, наконец, файл application.yml для службы шлюза ...


    server:
      servlet:
        contextPath: /
      port: 80
    spring:
      application:
        name: api.gateway.ben.com
      sleuth:
        trace-id128: true
        sampler:
          probability: 1.0
      cloud:
        gateway:
          routes:
          - id: admin-ui-2
            predicates:
            - Path=/admin-ui-2/echo/*
            filters:
            - SetPath=/fred
            - AddRequestHeader=X-Request-Foo, 2a9c5e36-2c0f-4ad3-926c-cb20d4428462
            - AddResponseHeader=X-Response-Foo, Bar
            uri: http://localhost:8080
    logging:
      pattern:
        level: "[%X{X-B3-TraceId}/%X{X-B3-SpanId}] %-5p [%t] %C{2} - %m%n"
      level:
        org.springframework.web: DEBUG


person brunch    schedule 26.10.2018    source источник
comment
что это значит level:enter code here ?. Я попробовал ваши настройки журнала. Я могу просматривать журналы.   -  person Barath    schedule 28.10.2018
comment
Извините, это опечатка. Он был удален.   -  person brunch    schedule 30.10.2018
comment
Бен, я пробовал, и это хорошо для меня. Поделитесь кодом по ссылке и поделитесь своими ожиданиями? просто чтобы включить ведение журнала на корневом уровне и посмотреть, можете ли вы его увидеть   -  person Barath    schedule 30.10.2018


Ответы (1)


Spring Cloud Gateway уже может регистрировать запрос и ответ, вам просто нужно изменить уровень журнала на TRACE.

logging:
  level:
    org.springframework: TRACE

или, если быть более точным, просто зарегистрировать req / resp:

logging:
  level:
    org.springframework.core.codec.StringDecoder: TRACE

Другой вариант - использовать фильтр в Spring Cloud Gateway и регистрировать req / resp и т. Д. С любыми регистраторами, такими как Log4j:

routeBuilder.route(id,
                            r -> {
                                return r.path(path).and().method(requestmethod).and()
                                        .header(routmap.getRequestheaderkey(), routmap.getRequestheadervalue()).and()
                                        .readBody(String.class, requestBody -> {
                                            return true;
                                        }).filters(f -> {
                                            f.rewritePath(rewritepathregex, replacement);
                                            f.prefixPath(perfixpath);

                                            f.filter(LogFilter);
                                            return f;
                                        }).uri(uri);
                            });

В этом файловом фильтре «LogFilter» вам необходимо определить, для какой логики будет использоваться логика.

person Dean Jain    schedule 16.05.2019
comment
Логируются только запросы .. Как насчет ответа? - person Viki Cullen; 23.08.2020