Aktivieren Sie die Protokollierung für 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
ojdbc6_g.jar
im classpath, aber immer dieselbe Fehlermeldung, ich habe aktualisiert mein Frage mit den Fehlerdetails. InformationsquelleAutor der Frage user3181365 | 2014-11-21
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.InformationsquelleAutor der Antwort Vlad Mihalcea
Gibt es viele Spionage-frameworks für diesen Zweck verfügbar ist , prüfen Sie bitte log4jdbc , ich fiel das ist, was Sie suchen.
Funktionen
alles, was Sie tun müssen, ist, ändern Sie die "driver class name",
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.
InformationsquelleAutor der Antwort Prince
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.
InformationsquelleAutor der Antwort Ralph Kirchner
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)
InformationsquelleAutor der Antwort jo-