java - JDBC 记录到文件

标签 java logging jdbc

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

实现此目标的好的解决方案是什么?一些示例用法将不胜感激。

我看过SLF4Jjdbcdslog ,但我不确定如何使用它登录文件。此外,我需要“过滤”一些日志(因为我不需要知道某些 getxxxx 方法何时被调用)

我更喜欢使用 java.util.logging 但这不是必需的。

谢谢。

** 更新 **

我找到了 this Oracle article ,但是它并没有真正说明如何以编程方式做同样的事情。

最佳答案

经过大量阅读,这就是我的工作方式:


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


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);

这就是魔法:

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));
    }
}

属性文件(来自 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

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

oracle.jdbc.handlers=java.util.logging.ConsoleHandler

声明要由 Oracle 的 JDBC 驱动程序使用的 ConsoleHandler。可以在这里声明任意数量的处理程序,每行一个,带有类的完整限定名:

oracle.jdbc.handlers=java.util.logging.ConsoleHandler
oracle.jdbc.handlers=java.util.logging.FileHandler
...

可以使用相同的规则提供自己定制的处理程序。以下几行用于设置处理程序

java.util.logging.ConsoleHandler.level=INFO

将调用 ConsoleHandler 处理程序实例的方法 setLevel(Level.INFO)

com.my.own.project.logging.handler.MyHandler.foo=Bar

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

登录愉快!

关于java - JDBC 记录到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738181/

相关文章:

applet - java.lang.NoClassDefFoundError 与我的小程序

java - Maven - Spring Boot Starter 的版本

java - 如何在java中确定数据库表列的大小

python - Pytest 日志记录忽略捕获日志的 pytest.ini log_cli_format

java - 将 Java 数据输入到 SQL 数据库

java - 列表元素未正确累积

java - 共享属性时抽象类与接口(interface)

java - 即使设置了默认启动器,如何使启动器选择器弹出

python - Windows 中 Python 全局变量的作用域

c++ - 在 C++ 中截断文件