Spring Boot REST приложение здесь. Я пытаюсь настроить аудит запросов Spring Boot для регистрации каждого HTTP-запроса, который получают любые ресурсы / контроллеры, со следующей информацией:
- Мне нужно видеть в журналах точный URL-адрес HTTP (путь), запрошенный клиентом, включая метод HTTP и любые параметры строки запроса ; и
- Если есть тело запроса (например, с POST или PUT), мне нужно также просмотреть содержимое этого тела в журналах
Моя лучшая попытка на данный момент:
@Component
public class MyAppAuditor {
private Logger logger;
@EventListener
public void handleAuditEvent(AuditApplicationEvent auditApplicationEvent) {
logger.info(auditApplicationEvent.auditEvent);
}
}
public class AuditingTraceRepository implements TraceRepository {
@Autowired
private ApplicationEventPublisher applicationEventPublisher
@Override
List<Trace> findAll() {
throw new UnsupportedOperationException("We don't expose trace information via /trace!");
}
@Override
void add(Map<String, Object> traceInfo) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
AuditEvent traceRequestEvent = new AuditEvent(new Date(), "SomeUser", 'http.request.trace', traceInfo);
AuditApplicationEvent traceRequestAppEvent = new AuditApplicationEvent(traceRequestEvent);
applicationEventPublisher.publishEvent(traceRequestAppEvent);
}
}
Однако во время выполнения, если я использую следующую команду curl:
curl -i -H "Content-Type: application/json" -X GET 'http://localhost:9200/v1/data/profiles?continent=NA&country=US&isMale=0&height=1.5&dob=range('1980-01-01','1990-01-01')'
Тогда я вижу только следующие сообщения журнала (где MyAppAuditor
отправляет события аудита):
{ "timestamp" : "14:09:50.516", "thread" : "qtp1293252487-17", "level" : "INFO", "logger" : "com.myapp.ws.shared.auditing.MyAppAuditor", "message" : {"timestamp":"2018-06-29T18:09:50+0000","principal":"SomeUser","type":"http.request.trace","data":{"method":"GET","path":"/v1/data/profiles","headers":{"request":{"User-Agent":"curl/7.54.0","Host":"localhost:9200","Accept":"*/*","Content-Type":"application/json"},"response":{"X-Frame-Options":"DENY","Cache-Control":"no-cache, no-store, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","Pragma":"no-cache","Expires":"0","X-XSS-Protection":"1; mode=block","X-Application-Context":"application:9200","Date":"Fri, 29 Jun 2018 18:09:50 GMT","Content-Type":"application/json;charset=utf-8","status":"200"}},"timeTaken":"89"}} }
Итак, как вы можете видеть, аудитор выбирает базовый путь (/v1/data/profiles
), но не регистрирует ни один из параметров строки запроса. Я также вижу аналогичное отсутствие информации о теле запроса при попадании в конечные точки POST или PUT, для которых действительно требуется тело запроса (JSON).
Что мне нужно сделать, чтобы настроить эти классы (или другие классы / конфиги Spring) так, чтобы я получил требуемый уровень аудита запросов?