Мониторинг SQL: P6Spy JDBC Logger
Никита КовалевУходим от (?, ?, ?, ?, ?) в красивое и понятное
I. Dependency Injection
Есть вариант внедрить p6spy через автоконфигурацию gavlyukovskiy/spring-boot-data-source-decorator, но много пользователей сталкиваются с различными issue, например с дублированием логов, что было и со мной, поэтому ставим dependency p6spy руками
II. application.yml
1. Отрубаем show_sql, format_sql из spring.jpa.propperties - они нам больше не товарищи.
2. Идем в spring.datasource.url, добавляем proxy p6spy, выглядеть будет примерно так:
jdbc:p6spy:postgresql://localhost:5432/ch
3. Меняем spring.datasource.driver-class-name: com.p6spy.engine.spy.P6SpyDriver
III. Конфигурируем P6Spy
1. Создаем в resources/spy.propperties
2. Определяем must-have параметры:
- driverlist - ставим ровно тот, что у нас был в application.yml
- appender - выводим логи либо в консоль (com.p6spy.engine.spy.appender.StdoutLogger) или пишем отдельно в файл (com.p6spy.engine.spy.appender.FileLogger), но в таком случае не забыть указать пропертю с названием logfile=spy.log
- logMessageFormat - формат отображения логов. Из коробки предлагается выбрать SingleLineFormat, либо MultiLineFormat.
Разница у них лишь в символах переноса строки \n, но есть общая неприятная штука - это отображение сначала нашего прежнего statement, словно никакого p6spy и нет, а уже потом красивого со значениями. Не понятно, почему создатели решили, что необходимо показывать нам результат "было - стало".
Избавляемся от этого рудимента так: создаем свой formatter, имплементируя более приятный MessageFormattingStrategy, переопределяем formatMessage, в return которого избавляемся от String prepared, объявленной в параметрах метода.
Указываем reference путь к нашему классу в logMessageFormat, profit.
Можем вывести логи в любом удобном для нас формате, хоть с emoji, но это уже другая история.
Полный список конфигураций spy.propperties на официальном сайте - можно себе закопипастить все содержимое, комментарии снимать по мере необходимости
Про P6Spy узнал из докладов Вячеслава Круглова, в частности Как начинающему Java-разработчику подружиться со своей базой данных?, где этот инструмент приводится для мониторинга поведения hibernate
Отсебятина: P6Spy мне очень помог в Сбербанке, когда у меня были нативные запросы к oracle через процедуры, а я парсил из запроса переменные, чтобы подставить их в statement. Через логи удалось понять, почему сыпятся ошибки, а именно требовалось обернуть входные аргументы в TO_NUMBER, TO_DATE