Я вынужден задать этот вопрос, потому что все остальное, что задокументировано, не работает.
Цель: регистрировать операторы SQL по мере их выполнения в БД вместе с их ограниченными переменными.
Среда: Payara 5.182, Hibernate 5.3.2, SLF4j с Logback.
Похоже, что официальный подход заключается в том, чтобы НЕ касаться persistence.xml, чтобы включить ведение журнала гибернации, а правильно настроить структуру ведения журнала.
pom.xml
<!-- Logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
logback.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
<appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender">
<layout class = "ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name = "app" level = "TRACE"/>
<logger name = "org.hibernate.sql" level = "DEBUG">
<appender-ref ref = "STDOUT" />
</logger>
<logger name = "org.hibernate.type.descriptor.sql" level = "TRACE">
<appender-ref ref = "STDOUT" />
</logger>
<root level = "debug">
<appender-ref ref = "STDOUT" />
</root>
</configuration>
Демо EJB только для тестирования простого запроса:
@PostConstruct
public void init(){
logger.info("Startup EJB. Executing demo query....");
List resultList = em.createQuery("select p from Project p where p.name = ?1")
.setParameter(1, "test")
.getResultList();
int size = resultList.size();
logger.info("Result list size = {}",size);
}
Результат в консоли
Info: Clustered CDI Event bus initialized
Info: 23:57:31,332 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
23:57:31,333 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
23:57:31,336 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/teohaik/gitProjects/seagle-server/target/seagle-1.0-SNAPSHOT/WEB-INF/classes/logback.xml]
23:57:31,561 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
23:57:31,565 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
23:57:31,613 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
23:57:31,880 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:57:31,886 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [seagle] to TRACE
23:57:31,886 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.hibernate.sql] to DEBUG
23:57:31,886 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[org.hibernate.sql]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.hibernate.type.descriptor.sql] to TRACE
23:57:31,889 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[org.hibernate.type.descriptor.sql]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
23:57:31,889 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
23:57:31,889 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:57:31,893 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@23351046 - Registering current configuration as safe fallback point
Info: 23:57:31.920 [admin-thread-pool::admin-listener(1)] INFO
g.u.t.s.services.VersionProvider - Startup EJB. Executing demo query....
g.u.t.s.services.VersionProvider - Result list size = 0
Info: Initializing Soteria 1.1-b01 for context '/seagle-server'
Info: Initializing Mojarra 2.4.0-m01.payara-p5 for context '/seagle-server'
Info: Loading application [seagle] at [/seagle-server]
Info: OpenAPI document created.
Info: application was successfully deployed in 12.196 milliseconds.
Только догадываюсь, но org.hibernate.sql
должен быть org.hibernate.SQL
(с большой буквы).
Но второй регистратор org.hibernate.type.descriptor.sql
правильный, и, по крайней мере, параметр должен быть зарегистрирован. Я снова предполагаю, что спящий режим не обрабатывает механизм возврата в исходное состояние правильно. Как объясняется в https://www.whatts-on-java.org/hibernate-logging-guide/, hibernate использует jboss-logging, который направляет сообщения журнала в slf4j, но я не уверен, правильно ли он находит slf4j. Я предлагаю удалить зависимость slf4j-api, поскольку логбэк уже предоставляет ее. Может быть, это исправит конфигурацию.
У меня была такая же проблема с log4j2 на Payara. После долгой отладки инициализации ведения журнала jboss (Hibernate внутренне использует ведение журнала jboss) я нашел класс org.jboss.logging.LoggerProviders. Это отправная точка, в которой ведение журнала jboss устанавливает целевой поставщик ведения журнала - log4j2, jdk или другой. Конкретный поставщик ведения журнала выбирается системным свойством org.jboss.logging.provider или классами целевого поставщика регистратора, если они присутствуют в пути к классам.
Но первое использование регистратора jboss происходит из валидатора Payara Hibernate, а делегированный загрузчик классов Payara в данный момент не видит никаких jar-файлов в папке домена / lib или в пакете приложения (например, EAR). Итак, класс LoggerProviders не находит файл jar реализации log4j2 и, наконец, использует java.util.Logging
Окончательное решение этой проблемы с загрузкой классов - установить для конфигурации Payara 'fish.payara.classloading.delegate' значение false, как описано здесь https://payara.gitbooks.io/payara-server/documentation/payara-server/classloading.html С этой конфигурацией и банками log4j2 в EAR или в домене / lib я могу регистрировать SQL через log4j2