Включить ведение журнала для операторов 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
Ответы
Ответ 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 описали это здесь, и после некоторых проб и ошибок я заставил его работать:
Поместите файл jar ojdbc с поддержкой трассировки в путь к классам. Цитата со связанной страницы Oracle: "Чтобы получить выходные данные журнала, вы должны использовать файлы JAR отладки, которые обозначены" _g "в имени файла, например ojdbc5_g.jar или ojdbc6_g.jar." Моя установка Oracle 11g содержала
Создайте файл 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
Добавьте свойства JVM "-Doracle.jdbc.Trace = true -Djava.util.logging.config.file = logging.properties" в команду запуска java для приложения JDBC.
Приложение JDBC должно теперь создать файл с именем jdbc.log, который должен содержать необходимую информацию. В некоторых случаях может потребоваться указать полный путь к файлу logging.properties.
Ответ 4
Вы пытались установить соответствующее системное свойство? например. для TRACE:
System.setProperty( "oracle.jdbc.Trace", Boolean.TRUE.toString() );
(из https://docs.oracle.com/cd/B28359_01/java.111/b31224/diagnose.htm)