Для Spring WebFlux, работающего на Netty, я хочу иметь журналы доступа, как в Tomcat, но ничего не нахожу в документация Spring.
Кто-нибудь может помочь?
Для Spring WebFlux, работающего на Netty, я хочу иметь журналы доступа, как в Tomcat, но ничего не нахожу в документация Spring.
Кто-нибудь может помочь?
Это было реализовано в Netty v0.7.9.RELEASE после этой проблемы. Согласно инструкциям, опубликованным здесь, вы можете включить журнал так:
-Dreactor.netty.http.server.accessLogEnabled=true
И
reactor.netty.http.server.AccessLog
Обратите внимание, что на данный момент поддерживается только CLF.
Другие решения, доступные до того, как эта функция была реализована, например:
Как упоминалось в комментарии @GreyTeardrop, вы можете установить уровень журнала reactor.ipc.netty.channel.ContextHandler
и reactor.ipc.netty.http.server.HttpServer
на DEBUG
. Это создаст многострочный дамп каждого сообщения в виде таблицы hex + ASCII. Не совсем приятно для использования в продакшене, но может быть полезно для отладки.
Если в вашем проекте есть 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
.
Spring Boot Actuator реализует трассировку с помощью HttpTraceWebFilter
. Если вы не хотите использовать решение Actuator, вы можете вдохновиться исходным кодом HttpTraceWebFilter
и реализовать свое собственное WebFilter
. Предоставьте его как компонент Spring, и он будет автоматически зарегистрирован в Netty.
В последнюю версию 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
Включить журнал доступа 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>
Расширяя отличный ответ от Адама Мичалика, я просто хочу отметить, что использование аргумента JVM -Dreactor.netty.http.server.accessLogEnabled=true
вместе с регистратором reactor.netty.http.server.AccessLog
работал на меня с Гринвичем, но не с Финчли.
Я использую Spring Cloud Gateway v2.1.2, поэтому я думаю, что это имеет смысл, учитывая раздел Release Trains в Весеннее облако.
reactor.ipc.netty.channel.ContextHandler
иreactor.ipc.netty.http.server.HttpServer
наDEBUG
. - person Grey Teardrop   schedule 28.11.2017