복붙노트

[SQL] JDBC를 사용하는 경우 SQL 문에 대한 로깅을 설정하는 방법

SQL

JDBC를 사용하는 경우 SQL 문에 대한 로깅을 설정하는 방법

나는 이클립스 IDE에서 Oracle 데이터베이스에 연결하여 내 JDBC 프로그램을 사용하여 로그를 수 있도록 노력하고 있습니다.

나는 파일이 SO 후 JDBC 로깅 겪었 나는 자바 프로그램 아래에 만들어 내 이클립스 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 배치하여 내 프로그램을 실행할 때 :

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

그때 클래스 경로에 ojdbc6_g.jar있는 경우도 내가 같은 예외를 얻고있다.

내 JDBC 프로그램에 대한 로깅을 사용할 수있는 방법을 알려주세요? 기본적으로 나는 내부 JDBC 코드에 의해 생성 된 로그를 볼 것으로 예상하고있다.

최신 정보: 지금은 내 프로그램 예외 이하주고, 클래스 경로에 ojdbc6dms.jar 파일을 배치 :

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

해결법

  1. ==============================

    1.당신은 스프링 프레임 워크를 사용하는 경우, 데이터 소스 프록시는 매우 편리합니다. 당신은 기본적으로 모든 데이터 소스를 랩 어라운드 그냥 로깅 동작을 추가 할 수 있습니다.

    당신은 스프링 프레임 워크를 사용하는 경우, 데이터 소스 프록시는 매우 편리합니다. 당신은 기본적으로 모든 데이터 소스를 랩 어라운드 그냥 로깅 동작을 추가 할 수 있습니다.

    자바 EE를 사용하는 경우, 다음에 p6spy는 좋은 대안이다 :

    배후에 p6spy는 데이터 소스가 응용 프로그램 서버에 의해 제공되기 때문에 훨씬 더 편리 자바 EE 애플리케이션에있는 드라이버 수준에서 문 인터셉터를 제공한다.

  2. ==============================

    2.2019 업데이트 : 2015 년에 p6spy 여전히 적극적으로 유지 될 것으로 보인다 이후 log4jdbc이 유지되지 않았습니다.

    2019 업데이트 : 2015 년에 p6spy 여전히 적극적으로 유지 될 것으로 보인다 이후 log4jdbc이 유지되지 않았습니다.

    스파이의 많은이 목적을 위해 사용 가능한 프레임 워크가있다, 나는 이것이 당신이 찾고있는 무엇 하락, log4jdbc 확인하시기 바랍니다.

    풍모

    용법

  3. ==============================

    3.아주 오래된 주제, 나도 알아,하지만 아직 언급되지 않은 것은 오라클의 솔루션은 단지 필요한 사용하여 응용 프로그램 코드의 변화를 필요로하지 않는 존재 오라클 JDBC 드라이버 및 JVM 특성을 통해 로깅 사용을 추적 가능 시작시.

    아주 오래된 주제, 나도 알아,하지만 아직 언급되지 않은 것은 오라클의 솔루션은 단지 필요한 사용하여 응용 프로그램 코드의 변화를 필요로하지 않는 존재 오라클 JDBC 드라이버 및 JVM 특성을 통해 로깅 사용을 추적 가능 시작시.

    오라클 자체는 여기를 설명했고, 약간의 시행 착오 후에 나는 일에 그것을 가지고 :

    JDBC의 응용 프로그램은 이제 원하는 정보를 포함해야한다라는 파일 jdbc.log을 생산한다. 경우에 따라서는 logging.properties 파일의 전체 경로를 지정해야 할 수 있습니다.

  4. ==============================

    4.당신은 해당 시스템 속성을 설정 봤어? 예를 들면. TRACE에 대한 :

    당신은 해당 시스템 속성을 설정 봤어? 예를 들면. TRACE에 대한 :

    System.setProperty( "oracle.jdbc.Trace", Boolean.TRUE.toString() );
    

    (행 https://docs.oracle.com/cd/B28359_01/java.111/b31224/diagnose.htm)

  5. ==============================

    5.당신의 log4j를 사용하는 가정 만이 작업을 수행 :

    당신의 log4j를 사용하는 가정 만이 작업을 수행 :

    JDBC에서 진단 가능성 : 오라클 JDBC 개발자 가이드에서 언급 한 바와 같이 ojdbc_g 사용 참고 19.3 드라이버는 이제 메이븐에, 아니면 그냥 수동으로 다운로드 할 수 있습니다.

            <dependency>
                <groupId>com.oracle.ojdbc</groupId>
                <artifactId>ojdbc8_g</artifactId>
                <version>19.3.0.0</version>
            </dependency>
    

    또한 Log4j는 JDK 로깅 어댑터가 필요합니다

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-jul</artifactId>
                <version>2.13.0</version>
            </dependency>
    

    이러한 시스템의 속성을 설정합니다 : -Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager -Doracle.jdbc.Trace 사실 =

    log4j2.xml에서 로거 구성

            <Logger name="oracle.jdbc" level="TRACE">
                <AppenderRef ref="Console"/>
            </Logger>
            <Logger name="oracle.sql" level="TRACE">
                <AppenderRef ref="Console"/>
            </Logger>
    

    참고 수준 = "ALL"는 기록의 최고의 수준을 줄 것이다

  6. from https://stackoverflow.com/questions/27060563/how-to-enable-logging-for-sql-statements-when-using-jdbc by cc-by-sa and MIT license