Aktivieren der Protokollierung für SQL-Anweisungen bei der Verwendung von JDBC
Ich versuche zu aktivieren, meldet mit meinem JDBC-Programm, indem Sie die Verbindung zu Oracle-Datenbank in eclipse IDE.
Ich Durchlaufen haben, SO schreiben Sie JDBC-Protokollierung in Datei
dann erstellt habe ich unter java-Programm und es läuft aus meiner eclipse-IDE, aber ich war nicht in der Lage, um zu sehen, alle erzeugten Protokolle der JDBC-Treiber-Klassen.
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();
}
}
}
und ich haben folgenden Inhalt in meinem OracleLog.Eigenschaften Datei:
.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
Aber wenn ich mein Programm durch die Platzierung ojdbc6-11.2.0.3.jar
im classpath, dann erhalte ich die exception:
INFO: Test Message
javax.management.InstanceNotFoundException: com.oracle.jdbc:type=diagnosability,name=sun.misc.Launcher$AppClassLoader@73d16e93
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
Wenn ich ojdbc6_g.jar
im classpath, dann bin ich auch immer dieselbe Ausnahme.
Bitte lassen Sie mich wissen, wie kann ich aktivieren Sie die Protokollierung für meinen JDBC-Programm? grundsätzlich bin ich zu sehen erwartet die erzeugten Protokolle, die von der internen JDBC-code.
Update:
Nun legte ich ojdbc6dms.jar
- Datei im classpath, mein Programm gibt die unten Ausnahme:
Nov 28, 2014 9:09:02 PM jdbc.chap2.Logging main
INFO: Test Message
javax.management.InstanceNotFoundException: com.oracle.jdbc:type=diagnosability,name=sun.misc.Launcher$AppClassLoader@73d16e93
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
- Haben Sie die richtigen Treiber im classpath? 'Sicherzustellen, dass die debug-JAR-Datei, sagen ojdbc5_g.jar oder ojdbc6_g.jar ist das nur Oracle-JDBC-JAR-Datei in die CLASSPATH-environment-variable.' und 'To get log Ausgabe verwenden, müssen Sie die debug-JAR-Dateien, welche angegeben sind mit "_g" in die Datei, name, '
- Jetzt habe ich versucht, mit
ojdbc6_g.jar
im classpath, aber immer dieselbe Fehlermeldung, ich habe aktualisiert mein Frage mit den Fehlerdetails. - die mbean registriert ist, mit einem anderen Namen, versuchen Sie es mit jconsole und sehen Sie die mbean-Namen und den richtigen Namen.
- Ich habe dieses Programm in eclipse und es läuft als eigenständiges Programm. Ich bin neu in Jconsole, ich habe den Befehl ausführen auf meine Eingabeaufforderung, können Sie mir bitte sagen, wie komme ich an die mbean-name?
- Haben Sie gesehen, diese Frage, und speziell die code, der mit ihm geht?
- ja ich habe auch gesagt, ich bin nach dem gleichen posten und den code, den ich verwende, ist der gleiche code, der gepostet wird, in Frage.
- Hast du den DEV-Paket für Ihre Oracle-Treiber? Es scheint Ihnen fehlen die notwendigen Klassen anmelden, die Anfragen aus der Treiber.
- Vielen Dank für die Beantwortung, ich habe die Jar-Datei bereits in meiner Frage im classpath, bitte lassen Sie mich wissen, wie das DEV-Paket?
- Die Treiber sind hier und Sie brauchen das "dms" ersetzt.
- Ich bin immer dieselbe Ausnahme, ich bin nicht in der Lage, es zu bekommen, wie kann ich das beheben das
InstanceNotFoundException
. Auch dieses mal bin ich immer noch eine Ausnahme fürClassNotFoundException: oracle.dms.console.DMSConsole
ich habe versucht im internet, um diedms.jar
Datei, aber ich bin nicht in der Lage, es zu finden. Ich Angaben in der update-Sektion für meine Frage. Können Sie mir bitte sagen, wie ich das beheben kann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du mit Spring framework, dann die datasource-proxy ist sehr bequem. Grundsätzlich können Sie die wrap around
DataSource
und fügen Sie einfach das logging-Verhalten.Wenn Sie mit Java EE, dann P6spy ist eine gute alternative:
Hinter den kulissen, p6spy bietet die Anweisung interceptor am
Driver
Ebene, das ist viel bequemer für Java EE-Anwendungen, weil dieDataSource
wird durch den application server.Gibt es viele Spionage-frameworks für diesen Zweck verfügbar , bitte überprüfen Sie log4jdbc , ich fiel das ist, was Sie suchen.
Funktionen
alles, was Sie tun müssen, ist, ändern Sie die "driver class name", um
net.sf.log4jdbc.DriverSpy und Stelle "jdbc:log4", um Ihre vorhandenen
jdbc-url, richten Sie Ihre logging-Kategorien, und Sie sind bereit zu gehen!
automatisch in der SQL-Ausgabe. Dies Verbessert
Lesbarkeit und debugging für viele Fälle.
helping zu identifizieren, die Aussagen, die zu langsam läuft und das
Daten können nachbearbeitet werden mit einem mitgelieferten Werkzeug zu produzieren profiling
Bericht von Daten für die schnelle Identifizierung von langsamen SQL in der Anwendung.
Verbindungs-pooling oder threading-Problemen. Funktioniert mit jeder zugrunde liegenden
JDBC-Treiber, mit JDK 1.4 und höher, und SLF4J 1.x.
Nutzung
Die zugrunde liegenden Treiber, der ausspioniert wird, in vielen Fällen wird automatisch geladen, ohne zusätzliche Konfiguration.
Voranstellen jdbc:log4 zu den normalen jdbc-url, die Sie verwenden.
Zum Beispiel, wenn Ihre normale jdbc-url ist
jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/Datenbanken/MyDatabase
dann würden Sie es zu ändern:
jdbc:log4jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/Datenbanken/MyDatabase
Richten Sie Ihren Logger.
jdbc.sqlonly: Protokolliert nur SQL. SQL ausgeführt, in eine vorbereitete Anweisung wird automatisch angezeigt, mit binden Argumente ersetzt, mit den Daten, gebunden an die position, für erheblich verbesserte Lesbarkeit. 1.0
jdbc.sqltiming: Protokolliert der SQL -, post-Ausführung, einschließlich timing-Statistiken auf, wie lange der SQL nahm, um Sie auszuführen. 1.0
jdbc.audit: Protokolliert ALLE JDBC-Aufrufe außer für ResultSets. Dies ist eine sehr umfangreiche Ausgabe, und die ist normalerweise nicht erforderlich, es sei denn, das aufspüren eines bestimmten JDBC-problem. 1.0
jdbc.resultset: ja voluminöser, da alle Aufrufe von ResultSet-Objekten protokolliert. 1.0
jdbc.Verbindung: Protokolle-Verbindung öffnen und schließen Ereignisse sowie dumping alle offene Verbindung zahlen. Dies ist sehr nützlich für die Jagd nach Verbindung Leck Probleme.
Sehr altes Thema, ich weiß, aber was noch nicht angesprochen wurde ist, dass für Oracle eine Lösung existiert, die nicht erfordert jede änderung in den code der Anwendung, einfach mit der gewünschten trace-fähigen Oracle-JDBC-Treiber und aktivieren die Protokollierung über die JVM-Eigenschaften beim Start.
Oracle selbst beschrieben haben, diese hier, und nach einigen trial-and-error habe ich es an die Arbeit:
Legen Sie die Ablaufverfolgung ojdbc jar Datei in den classpath. Zitat aus dem verlinkten Oracle-Seite: "Um die log-Ausgabe, müssen Sie die debug-JAR-Dateien, welche angegeben sind mit "_g" in den Namen der Datei, wie ojdbc5_g.jar oder ojdbc6_g.jar." Meine Oracle-11g-installation enthalten
Erstellen einer Protokollierung.properties-Datei wie beschrieben auf der verlinkten Oracle-Seite, und stellen Sie die protokollierungsstufen für Ihre Bedürfnisse. Beispiel:
.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
Fügen Sie die JVM-Eigenschaften "-Doracle.jdbc.Trace=true -Djava.util.die Protokollierung.config.file=logging.Eigenschaften", um die java-Start-Befehl für die JDBC-Anwendung.
Den JDBC-Anwendung sollten nun eine Datei mit dem Namen jdbc.log enthalten die gewünschten Informationen. In einigen Fällen kann es erforderlich sein, geben Sie den vollständigen Pfad zu der Anmeldung.Eigenschaften-Datei.
.level=.SEVERE
? Es gibt mir ein schlechtes level-Wert " - Fehler..level=SEVERE
oracle.jdbc.level = CONFIG
statt.FINEST
überflutet Euch mit einer Menge von Nachrichten.Haben Sie versucht, die Einstellung der entsprechenden system-Eigenschaft? zB. für die SPUR:
(aus https://docs.oracle.com/cd/B28359_01/java.111/b31224/diagnose.htm)