Access Logger as a HttpExchangeRepository implementation
<dependency>
<groupId>am.ik.access-logger</groupId>
<artifactId>access-logger</artifactId>
<version>0.3.2</version>
</dependency>
<!-- Spring Boot Actuator is also required -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
import am.ik.accesslogger.AccessLogger;
import am.ik.accesslogger.AccessLoggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class AppConfig {
@Bean
public AccessLogger accessLogger() {
return AccessLoggerBuilder.accessLogger().filter(httpExchange -> {
final String uri = httpExchange.getRequest().getUri().getPath();
return uri != null && !(uri.equals("/readyz") || uri.equals("/livez") || uri.startsWith("/actuator"));
}).build();
}
}
Note
AccessLoggerBuilder
is available since 0.3.0
By deafult, only request_headers
, response_headers
and time_taken
are recorded.
In order to log all attributes, you also need to configure management.httpexchanges.recording.include
as follows:
management.httpexchanges.recording.include=request_headers,response_headers,remote_address,principal,time_taken
AccessLogger accessLogger = AccessLoggerBuilder.accessLogger()
// Change the log level
.level(Level.INFO) // Default: INFO
// Change the logger name
.loggerName("accesslog") // Default: accessLog
// Enable structured logging via SLF4J key-value API
.addKeyValues(true) // Default: false
// Make log messages empty if structured logging is enabled
.emptyLogMessage(true) // Default: false
// Customize log message
.logCustomizer((builder, exchange) -> {})
// Customize logging Event
.loggingEventCustomizer((builder, exchange) -> builder)
// Filter the log message depending on the http request
.filter(httpExchange -> {
final String uri = httpExchange.getRequest().getUri().getPath();
return uri != null && !(uri.equals("/readyz") || uri.equals("/livez") || uri.startsWith("/actuator"));
})
.build();