Как включить журнал доступа для Spring WebFlux?

Для Spring WebFlux, работающего на Netty, я хочу иметь журналы доступа, как в Tomcat, но ничего не нахожу в документация Spring.

Кто-нибудь может помочь?


person hongshuwei    schedule 03.11.2017    source источник
comment
Насколько мне известно, в Spring Boot нет ничего предустановленного для серверов на базе Netty. Самое близкое, что вы можете получить из коробки, — это журнал Netty wire, переключив уровни журнала reactor.ipc.netty.channel.ContextHandler и reactor.ipc.netty.http.server.HttpServer на DEBUG.   -  person Grey Teardrop    schedule 28.11.2017


Ответы (4)


Это было реализовано в Netty v0.7.9.RELEASE после этой проблемы. Согласно инструкциям, опубликованным здесь, вы можете включить журнал так:

  • Запустите приложение с системным свойством -Dreactor.netty.http.server.accessLogEnabled=true

И

  • Включить ведение журнала INFO для reactor.netty.http.server.AccessLog

Обратите внимание, что на данный момент поддерживается только CLF.

Другие решения, доступные до того, как эта функция была реализована, например:

Проволочный бревно

Как упоминалось в комментарии @GreyTeardrop, вы можете установить уровень журнала reactor.ipc.netty.channel.ContextHandler и reactor.ipc.netty.http.server.HttpServer на DEBUG. Это создаст многострочный дамп каждого сообщения в виде таблицы hex + ASCII. Не совсем приятно для использования в продакшене, но может быть полезно для отладки.

HTTP-трассировка Spring Actuator

Если в вашем проекте есть Spring Actuator, он поддерживает отслеживание HTTP-запросов. Информация о трассировке отправляется bean-компоненту HttpTraceRepository. По умолчанию это InMemoryHttpTraceRepository, который содержит последние 100 трассировок.

Вы можете использовать это, реализовав свой собственный HttpTraceRepository или декоратор, который добавит журналирование трассировок. Вам нужно зарегистрировать его как bean-компонент — он заменит автоконфигурируемый InMemoryHttpTraceRepository.

Обратите внимание, что трассировки HTTP имеют только ограниченный набор информации о запросе и ответе, например. у вас нет доступа к телу или размеру запроса/ответа.

Решение, которое я реализовал, выглядит так:

@Bean
public HttpTraceRepository httpTraceRepository() {
    return new AccessLoggingHttpTraceRepositoryDecorator(
            new InMemoryHttpTraceRepository(),
            LoggerFactory.getLogger("netty.Access"),
            new HttpTraceLogFormatter()
    );
}

public class AccessLoggingHttpTraceRepositoryDecorator implements HttpTraceRepository {

    private HttpTraceRepository delegate;
    private Logger logger;
    private HttpTraceLogFormatter formatter;

    public AccessLoggingHttpTraceRepositoryDecorator(HttpTraceRepository delegate, Logger logger, HttpTraceLogFormatter formatter) {
        this.delegate = delegate;
        this.logger = logger;
        this.formatter = formatter;
    }

    @Override
    public List<HttpTrace> findAll() {
        return delegate.findAll();
    }

    @Override
    public void add(HttpTrace trace) {
        if (logger.isDebugEnabled()) {
            try {
                logger.debug(formatter.format(trace));
            } catch (Exception e) {
                logger.error("Failed to log trace " + trace, e);
            }
        }
        delegate.add(trace);
    }
}

public class HttpTraceLogFormatter {
    public String format(HttpTrace trace) {
        // TODO implement this according to your preference
        return ...;
    }
}

При таком подходе вы можете получить почти сообщение Common Log Format.

Возможно, вам придется настроить в своем application.yml то, что включено в объект трассировки, указав

management:
  trace:
    http:
      include: REQUEST_HEADERS, RESPONSE_HEADERS, PRINCIPAL, REMOTE_ADDRESS, TIME_TAKEN

По умолчанию включены только REQUEST_HEADERS, RESPONSE_HEADERS, COOKIE_HEADERS, TIME_TAKEN.

Ваш собственный журнал доступа WebFilter

Spring Boot Actuator реализует трассировку с помощью HttpTraceWebFilter. Если вы не хотите использовать решение Actuator, вы можете вдохновиться исходным кодом HttpTraceWebFilter и реализовать свое собственное WebFilter. Предоставьте его как компонент Spring, и он будет автоматически зарегистрирован в Netty.

person Adam Michalik    schedule 08.08.2018

В последнюю версию Reactor Netty добавлена ​​поддержка журналов доступа. Просто обновите версию Reactor до <reactor-bom.version>Bismuth-SR11</reactor-bom.version>. Затем вам просто нужно включить ведение журнала reactor.netty.http.server.AccessLog в access_log.log, используя любую используемую вами структуру ведения журнала.

Подробнее см. здесь: https://github.com/reactor/reactor-netty/issues/301#issuecomment-418402375

person kriver    schedule 04.10.2018

Включить журнал доступа netty с помощью системного свойства Java,

-Dreactor.netty.http.server.accessLogEnabled=true

и вы можете настроить систему ведения журнала на отдельный файл журнала доступа.

Ниже приведен пример конфигурации log4j2.

 <RollingRandomAccessFile name="ACCESS_LOG" fileName="access.log"
                                 filePattern="$${date:yyyy-MM}/access-%d{MM-dd-yyyy}-%i.log.gz"
                                 append="true">
            <PatternLayout pattern="[%t] %d{dd MM yyyy HH:mm:ss,SSS} %-5p %-15c{1} [%X]: %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="5 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="4"/>
        </RollingRandomAccessFile>
 <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
            <AppenderRef ref="ACCESS_LOG"/>
        </logger>
person MrKulli    schedule 15.02.2019

Расширяя отличный ответ от Адама Мичалика, я просто хочу отметить, что использование аргумента JVM -Dreactor.netty.http.server.accessLogEnabled=true вместе с регистратором reactor.netty.http.server.AccessLog работал на меня с Гринвичем, но не с Финчли.

Я использую Spring Cloud Gateway v2.1.2, поэтому я думаю, что это имеет смысл, учитывая раздел Release Trains в Весеннее облако.

person Greg    schedule 02.08.2019