Подтвердить что ты не робот

Включить ведение журнала для операторов SQL при использовании JDBC

Я пытаюсь включить журналы с помощью моей программы JDBC, подключившись к базе данных Oracle в среде eclipse IDE.

Я прошел через SO-сообщение JDBC в файл то я создал ниже java-программу и запустил ее из моей Eclipse IDE, но я не смог увидеть никаких журналов, сгенерированных классами JDBC-драйверов.

import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Logging {

    static Logger log = Logger.getLogger(Logging.class.toString());
    static Connection con = null;

    public static void main(String[] args) throws SQLException,
            ClassNotFoundException {
        System.setProperty("oracle.jdbc.Trace", Boolean.TRUE.toString());
        System.setProperty("java.util.logging.config.file",
                "OracleLog.properties");
        log.info("Test Message");
        enableLogging(false);
        getConnection();
        closeConnection();
    }

    static private void enableLogging(boolean logDriver) {
        try {
            oracle.jdbc.driver.OracleLog.setTrace(true);

            // compute the ObjectName
            String loader = Thread.currentThread().getContextClassLoader()
                    .toString().replaceAll("[,=:\"]+", "");
            javax.management.ObjectName name = new javax.management.ObjectName(
                    "com.oracle.jdbc:type=diagnosability,name=" + loader);

            // get the MBean server
            javax.management.MBeanServer mbs = java.lang.management.ManagementFactory
                    .getPlatformMBeanServer();

            // find out if logging is enabled or not
            System.out.println("LoggingEnabled = "
                    + mbs.getAttribute(name, "LoggingEnabled"));

            // enable logging
            mbs.setAttribute(name, new javax.management.Attribute(
                    "LoggingEnabled", true));

            File propFile = new File("path/to/properties");
            LogManager logManager = LogManager.getLogManager();
            logManager.readConfiguration(new FileInputStream(propFile));

            if (logDriver) {
                DriverManager.setLogWriter(new PrintWriter(System.err));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException,
            ClassNotFoundException {
        Properties connectionProps = new Properties();
        connectionProps.put("user", "test_app");
        connectionProps.put("password", "test");

        Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection(
                "jdbc:oracle:thin:@"+HOST_IP+":1521:"+SID,
                connectionProps);
        System.out.println("Connected to database");
        return con;
    }

    public static void closeConnection() throws SQLException {
        if (con != null) {
            con.close();
        }
    }

}

и у меня есть содержимое в файле OracleLog.properties:

.level=SEVERE
oracle.jdbc.level=INFO
oracle.jdbc.handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=INFO
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

Но когда я запускаю свою программу, поместив ojdbc6-11.2.0.3.jar в classpath, я получаю исключение как:

INFO: Test Message
javax.management.InstanceNotFoundException: com.oracle.jdbc:type=diagnosability,[email protected]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:643)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)
    at myjdbc.Logging.enableLogging(Logging.java:45)
    at myjdbc.Logging.main(Logging.java:24)
Connected to database

Если у меня есть ojdbc6_g.jar в classpath, то также я получаю такое же исключение.

Пожалуйста, дайте мне знать, как включить ведение журнала для моей программы JDBC? в основном я ожидаю увидеть журналы, созданные внутренним кодом JDBC.

Update: Теперь я поместил ojdbc6dms.jar файл в classpath, моя программа дает ниже исключения:

Nov 28, 2014 9:09:02 PM jdbc.chap2.Logging main
INFO: Test Message
javax.management.InstanceNotFoundException: com.oracle.jdbc:type=diagnosability,[email protected]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:643)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)
    at jdbc.chap2.Logging.enableLogging(Logging.java:45)
    at jdbc.chap2.Logging.main(Logging.java:24)
Exception in thread "main" java.lang.NoClassDefFoundError: oracle/dms/console/DMSConsole
    at oracle.jdbc.driver.DMSFactory.<clinit>(DMSFactory.java:48)
    at oracle.jdbc.driver.PhysicalConnection.createDMSSensors(PhysicalConnection.java:2121)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:730)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:433)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:608)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at jdbc.chap2.Logging.getConnection(Logging.java:70)
    at jdbc.chap2.Logging.main(Logging.java:25)
Caused by: java.lang.ClassNotFoundException: oracle.dms.console.DMSConsole
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 10 more
4b9b3361

Ответ 1

Если вы используете фреймворк Spring, то datasource-proxy очень удобен. Вы можете в основном обернуть вокруг любого DataSource и просто добавить поведение ведения журнала.

введите описание изображения здесь

Если вы используете Java EE, то P6spy - хорошая альтернатива:

введите описание изображения здесь

За кулисами p6spy предоставляет рецептор-перехватчик на уровне Driver, что намного удобнее для приложений Java EE потому что DataSource предоставляется сервером приложений.

Ответ 2

Обновление 2019: log4jdbc не поддерживается с 2015 года. p6spy по-прежнему активно поддерживается.

Оригинальный ответ

Для этого доступно множество фреймворков Spy, пожалуйста, проверьте log4jdbc, я упал, это то, что вы ищете.

Особенности

  • Полная поддержка JDBC 3 и JDBC 4!
  • Прост в настройке, в большинстве случаев все, что вам нужно сделать, это изменить имя класса драйвера на net.sf.log4jdbc.DriverSpy и добавьте "jdbc: log4" к существующему jdbc url, настройте свои категории регистрации, и вы готовы к работе!
  • В зарегистрированном выводе для подготовленных операторов аргументы связывания автоматически вставляется в вывод SQL. Это значительно улучшает удобочитаемость и отладка для многих случаев.
  • Информация о времени SQL может быть сгенерирована, чтобы помочь определить, сколько времени занимает выполнение операторов SQL, помогает определить заявления, которые выполняются слишком медленно, и это данные могут быть постобработаны с помощью встроенного инструмента для создания профилирования Данные отчета для быстрой идентификации медленного SQL в вашем приложении.
  • Информация о номере соединения SQL генерируется, чтобы помочь идентифицировать проблемы с пулами соединений или многопоточностью. Работает с любым базовым Драйвер JDBC, с JDK 1.4 и выше, и SLF4J 1.x.
  • Программное обеспечение с открытым исходным кодом, лицензированное по лицензии Apache 2.0 для бизнеса

  • ИспользованиеПоместите jar log4jdbc (в зависимости от версии JDK) в путь к классу приложения.
  • выберите используемую систему регистрации, log4j, logback, регистрация общих ресурсов и т.д. поддерживаются
  • Установите класс драйвера JDBC на net.sf.log4jdbc.DriverSpy в конфигурации вашего приложения. Основной драйвер, на который шпионят во многих случаях, будет загружен автоматически без какой-либо дополнительной настройки.
  • Добавьте к jdbc: log4 обычный URL-адрес jdbc, который вы используете.

    Например, если ваш обычный jdbc url JDBC: котелок://локальный: 1527//дб-котелок-10.2.2.0-бен/базы данных /MyDatabase тогда вы бы изменили его на: JDBC: log4jdbc: котелок://локальный: 1527//дб-котелок-10.2.2.0-бен/базы данных /MyDatabase

  • Настройте свои регистраторы.

    jdbc.sqlonly: регистрирует только SQL. SQL, выполненный в подготовленном операторе, автоматически отображается с заменой аргументов привязки на данные, связанные в этой позиции, что значительно повышает удобочитаемость. 1.0

    jdbc.sqltiming: регистрирует SQL-запрос после выполнения, включая статистику времени выполнения SQL-запроса. 1.0

    jdbc.audit: регистрирует ВСЕ вызовы JDBC, кроме ResultSets. Это очень объемный вывод, который обычно не требуется, если не выявляется конкретная проблема JDBC. 1.0

    jdbc.resultset: еще более объемный, поскольку все вызовы объектов ResultSet регистрируются. 1.0

    jdbc.connection: регистрирует события открытия и закрытия соединения, а также выводит все номера открытых соединений. Это очень полезно для поиска проблем утечки соединения.

Ответ 3

Очень старая тема, я знаю, но еще не было упомянуто, что для Oracle существует решение, которое не требует каких-либо изменений в коде приложения, просто используя необходимый драйвер Oracle JDBC с поддержкой трассировки и включая ведение журнала через свойства JVM. при запуске.

Сами Oracle описали это здесь, и после некоторых проб и ошибок я заставил его работать:

  1. Поместите файл jar ojdbc с поддержкой трассировки в путь к классам. Цитата со связанной страницы Oracle: "Чтобы получить выходные данные журнала, вы должны использовать файлы JAR отладки, которые обозначены" _g "в имени файла, например ojdbc5_g.jar или ojdbc6_g.jar." Моя установка Oracle 11g содержала

  2. Создайте файл logging.properties, как описано на связанной странице Oracle, и настройте уровни ведения журнала в соответствии со своими потребностями. Пример:

    .level=SEVERE oracle.jdbc.level=FINEST oracle.jdbc.handlers=java.util.logging.FileHandler java.util.logging.FileHandler.level=FINEST java.util.logging.FileHandler.pattern=jdbc.log java.util.logging.FileHandler.count=1 java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter

  3. Добавьте свойства JVM "-Doracle.jdbc.Trace = true -Djava.util.logging.config.file = logging.properties" в команду запуска java для приложения JDBC.

Приложение JDBC должно теперь создать файл с именем jdbc.log, который должен содержать необходимую информацию. В некоторых случаях может потребоваться указать полный путь к файлу logging.properties.