Июль в SLF4j с драйвером оракула JDBC - PullRequest
1 голос
/ 14 июня 2011

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

  1. Сообщения, зарегистрированные моим приложением с использованием JUL, регистрируются, но те, которые регистрируются библиотеками оракула, не регистрируются.
  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;
    }

}


Ответы [ 2 ]

3 голосов
/ 20 февраля 2015

Если это поможет. Я использовал этот подход в загрузочном приложении 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. Ура!

2 голосов
/ 10 февраля 2012

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

Во-первых, вам определенно нужно использовать версию _g 'jar, котораяэто 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;

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

...