Показывать только эффективную строку SQL P6Spy
Я использую p6spy для регистрации операторов sql, сгенерированных моей программой. Формат выводимого файла spy.log выглядит так:
current time|execution time|category|statement SQL String|effective SQL string
Мне просто интересно, знает ли кто-нибудь, есть ли способ изменить файл spy.properties и есть только последний столбец, эффективная строка SQL, выводятся в файл spy.log? Я просмотрел файл свойств, но не нашел ничего, что, кажется, поддерживает это.
Спасибо!
Ответы
Ответ 1
В spy.properties существует свойство logMessageFormat
, которое вы можете установить для пользовательской реализации MessageFormattingStrategy
. Это работает для любого типа регистратора (т.е. Файла, slf4j и т.д.).
например.
logMessageFormat=my.custom.PrettySqlFormat
Пример использования шаблона форматирования формата Hibernate:
package my.custom;
import org.hibernate.jdbc.util.BasicFormatterImpl;
import org.hibernate.jdbc.util.Formatter;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
public class PrettySqlFormat implements MessageFormattingStrategy {
private final Formatter formatter = new BasicFormatterImpl();
@Override
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
return formatter.format(sql);
}
}
Ответ 2
Нет такой опции для достижения этой цели только с помощью конфигурации. Я думаю, что у вас 2 варианта:
Для более позднего варианта, я считаю, вы могли бы достичь этого через свой собственный класс (в зависимости от используемого вами регистратора, допустим, вы используете Log4jLogger).
Хорошо, если вы проверите соответствующую часть Log4jLogger github, а также sourceforge, ваша реализация должна быть довольно простой:
spy.properties:
appender=com.EffectiveSQLLog4jLogger
Сама реализация может выглядеть так:
package com;
import com.p6spy.engine.logging.appender.Log4jLogger;
public class EffectiveSQLLog4jLogger extends Log4jLogger {
public void logText(String text) {
super.logText(getEffectiveSQL(text));
}
private String getEffectiveSQL(String text) {
if (null == text) {
return null;
}
final int idx = text.lastIndexOf("|");
// non-perfect detection of the exception logged case
if (-1 == idx) {
return text;
}
return text.substring(idx + 1); // not sure about + 1, but check and see :)
}
}
Обратите внимание, что реализация должна охватывать github (новый проект дома, еще не выпущенная версия), а также sourceforge (исходный проект, версия 1.3).
Обратите внимание. Я сам не тестировал это предложение, но это может быть хорошей отправной точкой, и из самого обзора кода я бы сказал, что он может работать.
Ответ 3
Я согласен с @boberj, мы привыкли иметь журналы с форматом Hibernate, но не забывайте о пакетной обработке, поэтому я предлагаю использовать:
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
import org.hibernate.engine.jdbc.internal.Formatter;
/**
* Created by Igor Dmitriev on 1/3/16
*/
public class HibernateSqlFormatter implements MessageFormattingStrategy {
private final Formatter formatter = new BasicFormatterImpl();
@Override
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
if (sql.isEmpty()) {
return "";
}
String template = "Hibernate: %s %s {elapsed: %sms}";
String batch = "batch".equals(category) ? ((elapsed == 0) ? "add batch" : "execute batch") : "";
return String.format(template, batch, formatter.format(sql), elapsed);
}
}
Ответ 4
Вы можете запланировать com.p6spy.engine.spy.appender.SingleLineFormat.java
удаление подготовленного элемента и любая ссылка на P6Util следующим образом:
package com.p6spy.engine.spy.appender;
public class SingleLineFormat implements MessageFormattingStrategy {
@Override
public String formatMessage(final int connectionId, final String now, final long elapsed, final String category, final String prepared, final String sql) {
return now + "|" + elapsed + "|" + category + "|connection " + connectionId + "|" + sql;
}
}
Затем скомпилируйте только файл
javac com.p6spy.engine.spy.appender.SingleLineFormat.java
И замените существующий файл класса в p6spy.jar на новый.