背景:最近项目组对网关服务依赖的框架由zuul调整到Gateway.由于升级之后的网关服务没办法打成war包部署到tomcat。导致前期依赖tomcat的生成的access_log方案要调整。通过查询Gateway官网提供的生成access_log与我们之前相比缺了不少内容。能否实现Gateway生成的access_log内容定制化成了解决问题的关键。 解决方案:这里就不卖关子了。不过大家在阅读文章时候,建议去官网了解下。
import org.springframework.boot.web.embedded.netty.NettyServerCustomizer; import org.springframework.stereotype.Component; import reactor.netty.http.server.HttpServer; import reactor.netty.http.server.logging.AccessLog; import reactor.netty.http.server.logging.AccessLogFactory; import reactor.util.annotation.Nullable;
import java.net.InetSocketAddress; import java.net.SocketAddress; import java.time.format.DateTimeFormatter;
@Component public class AccessLogNettyServerCustomizer implements NettyServerCustomizer { static final String DEFAULT_LOG_FORMAT = ""{}" {} {} [{}] "{} {} {}" {} {} "{}" "{}" "{}" {} {} "{}" "{}" "{}" "{}" "; static final String MISSING = "-";
static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z");
@Override
public HttpServer apply(HttpServer httpServer) {
httpServer = httpServer.accessLog(true, AccessLogFactory.createFilter(
accessLogArgProvider -> true, accessLogArgProvider -> AccessLog.create(DEFAULT_LOG_FORMAT, applyAddress(accessLogArgProvider.remoteAddress()),MISSING, accessLogArgProvider.user()
,accessLogArgProvider.accessDateTime().format(DATE_TIME_FORMATTER), accessLogArgProvider.method(), accessLogArgProvider.uri(), accessLogArgProvider.protocol()
,accessLogArgProvider.status(),accessLogArgProvider.contentLength() > -1 ? accessLogArgProvider.contentLength() : MISSING
,accessLogArgProvider.responseHeader("Referer") == null ? MISSING : accessLogArgProvider.responseHeader("Referer")
,accessLogArgProvider.responseHeader("trackingID") == null ? MISSING : accessLogArgProvider.responseHeader("trackingID")
,accessLogArgProvider.requestHeader("User-Agent") == null ? MISSING : accessLogArgProvider.requestHeader("User-Agent")
,accessLogArgProvider.requestHeader("Host") == null ? MISSING : accessLogArgProvider.requestHeader("Host")))
);
return httpServer;
}
static String applyAddress(@Nullable SocketAddress socketAddress) {
return socketAddress instanceof InetSocketAddress ? ((InetSocketAddress) socketAddress).getHostString() : MISSING;
}
}
代码里的LOG_FORMAT请结合实际情况调整。 参考文章:www.helloworld.net/special/xtm…