JUL в SLF4j с драйвером oracle jdbc

Я пытаюсь перенаправить сообщения java.util.logging, зарегистрированные драйвером oracle jdbc и библиотекой oracle ucp (универсальный пул соединений), но не могу этого сделать.

  1. Сообщения, зарегистрированные моим приложением с использованием JUL, регистрируются, но те, которые зарегистрированы библиотеками oracle, не регистрируются.
  2. Мое намерение здесь - перенаправить сообщения JUL в Logback, чтобы иметь более детализированное ведение журнала через конфигурацию. т.е. включение ведения журнала на уровне класса вместо уровня пакета, что, как я предполагаю, невозможно в конфигурации JUL (файл java.util.config).

Ниже приведен образец кода теста. Есть ли у вас какие-либо предложения по двум вышеупомянутым пунктам?


import oracle.ucp.jdbc.PoolDataSourceImpl;
import org.slf4j.bridge.SLF4JBridgeHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;

public class JavaUtilToSlf4jApp {
    private static Logger logger = Logger.getLogger(JavaUtilToSlf4jApp.class.getName());

    public static void main(String[] args) {
        SLF4JBridgeHandler.install();

        startConnectionPool();

        logger.info("Info Message");
    }

    private static void startConnectionPool() {
        PoolDataSourceImpl pds = new PoolDataSourceImpl();
        try {
            pds.setConnectionPoolName("Pool Name");
            pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
            pds.setConnectionFactoryProperties(getOracleDataSourceProperties());
            pds.setDataSourceName("Datasource Name");
            pds.setServerName("machine-name");
            pds.setPortNumber(1521);

            pds.setMinPoolSize(1);
            pds.setMaxPoolSize(1);

            pds.setMaxIdleTime(1800);
            pds.setValidateConnectionOnBorrow(true);

            pds.setUser("user");
            pds.setPassword("password");

            pds.startPool();
        } catch (SQLException e) {
            throw new RuntimeException("Cannot create project datasource ", e);
        }

        try {
            Connection connection = pds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        logger.info("Connection established");
    }

    private static Properties getOracleDataSourceProperties() {
        Properties p = new Properties();
        p.put("driverType", "oci");
        p.put("networkProtocol", "tcp");
        p.put("serviceName", "servicename");
        return p;
    }

}



person Andy Dufresne    schedule 14.06.2011    source источник


Ответы (2)


Если это поможет. Я применил этот подход в загрузочном приложении Spring, используя ojdbc_g версию файла jar драйвера:

  1. Установите системное свойство: System.setProperty("oracle.jdbc.Trace", "true").
  2. Инициализируйте драйвер / источник данных Oracle с помощью любого имеющегося у вас механизма (вручную, Spring, conn pool и т. Д.).

После инициализации источника данных программно установите уровень для регистратора "oracle.jdbc" JUL:

Logger ol = Logger.getLogger("oracle.jdbc");
ol.setLevel(Level.FINE);

Осталось выяснить, как сопоставить уровни ведения журнала JUL с уровнями ведения журнала SLF4J.

Работал внутри моего загрузочного приложения Spring. Ваше здоровье!

person Jesús Zazueta    schedule 19.02.2015

Это был полный беспорядок, и после того, как я получил некоторые записи, это все еще не работало так хорошо.

Во-первых, вам определенно нужно использовать версию jar "_g", которая представляет собой jar, который был скомпилирован с опцией отладки и включенным журналированием. Если вы не используете этот драйвер, это будет похоже на кровь из камня.

Во-вторых, вам нужно добавить параметр java -Doracle.jdbc.Trace=true.

В-третьих, вам нужно определить пакет в вашем файле журнала (например, logback.xml):

  <logger name="oracle" level="INFO" additivity="false">
    <appender-ref ref="SERVER_FILE" />
  </logger>

Это дало мне следующие результаты:

11:17:45.393 [UCP-worker-thread-3] INFO  oracle.jdbc.driver - SQL: select count(*) from mytable
11:17:45.956 [main] INFO  oracle.jdbc.driver - SQL: 

        select myfield 
          from mytable 
         where myotherfield='myvalue'      

11:17:46.159 [main] INFO  oracle.jdbc.driver - SQL: begin :1 := dbms_pickler.get_type_shape(:2,:3,:4,:5,:6,:7); end;

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

person Spencer Kormos    schedule 10.02.2012