Как сделать так, чтобы SQL-операторы журналирования работали в hibernate 5 и payara 5 [glassfish]

Я вынужден задать этот вопрос, потому что все остальное, что задокументировано, не работает.

Цель: регистрировать операторы 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.
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 109
2

Ответы 2

Только догадываюсь, но 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

Другие вопросы по теме