Мониторинг SQL: P6Spy JDBC Logger

Мониторинг SQL: P6Spy JDBC Logger

Никита Ковалев

Уходим от (?, ?, ?, ?, ?) в красивое и понятное

Пример statement здорового человека, p6spy в действии


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

Report Page