JDBC记录到文件

Yan*_*hon 10 java logging jdbc

我需要将所有查询记录到项目中的Oracle数据库中,并记录到日志文件中.

实现这一目标的方法是什么?一些样品用法将不胜感激.

我用jdbcdslog查看了SLF4J,但我不确定如何用它来登录文件.此外,我需要"过滤"一些日志(因为我不需要知道何时调用某些方法)getxxxx

优选地,我更喜欢使用java.util.logging但不是必需的.

谢谢.

**更新**

我发现了这篇Oracle文章,但它并没有真正告诉我如何以编程方式执行相同的操作.

Yan*_*hon 9

经过多次阅读,这就是我的工作方式:


注意:有关更多信息,请阅读JDBC文档中的Oracle Diagnosability


Properties prop = new Properties();
prop.put ("user", USER);
prop.put ("password", PASS);
// prop.put(propname, propValue);

Class.forName("oracle.jdbc.driver.OracleDriver");

enableLogging(false);

conn = DriverManager.getConnection("jdbc:oracle:thin:@"+HOST+":"+PORT+":"+SID, prop);
Run Code Online (Sandbox Code Playgroud)

这就是魔术:

static private void enableLogging(boolean logDriver) 
throws MalformedObjectNameException, NullPointerException, 
       AttributeNotFoundException, InstanceNotFoundException, 
       MBeanException, ReflectionException, InvalidAttributeValueException, 
       SecurityException, FileNotFoundException, IOException 
{
    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));
    }
}
Run Code Online (Sandbox Code Playgroud)

属性文件(来自Oracle的文档):

.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
Run Code Online (Sandbox Code Playgroud)

基本上,这是处理程序声明的地方

oracle.jdbc.handlers=java.util.logging.ConsoleHandler
Run Code Online (Sandbox Code Playgroud)

声明ConsoleHandlerOracle的JDBC驱动程序使用它.可以在此处声明任意数量和任意数量的处理程序,每行一个,具有类的完全限定名称:

oracle.jdbc.handlers=java.util.logging.ConsoleHandler
oracle.jdbc.handlers=java.util.logging.FileHandler
...
Run Code Online (Sandbox Code Playgroud)

可以提供具有相同规则的自定义处理程序.以下行是设置处理程序

java.util.logging.ConsoleHandler.level=INFO
Run Code Online (Sandbox Code Playgroud)

将调用梅索德setLevel(Level.INFO)的的ConsoleHandler处理程序实例.

com.my.own.project.logging.handler.MyHandler.foo=Bar
Run Code Online (Sandbox Code Playgroud)

会调用该方法setFoo("Bar")的的MyHandler处理程序实例.就是这样.

快乐的伐木!