Java JDBC日志记录到文件

Java JDBC日志记录到文件,java,logging,jdbc,Java,Logging,Jdbc,我需要将项目中对Oracle数据库的所有查询记录到日志文件中 实现这一目标的好办法是什么?一些样品的使用将不胜感激 我已经看过了,但我不确定如何使用它登录到文件。此外,我需要“过滤”一些日志(因为我不需要知道何时调用了某些getxxxx方法get) 我更愿意使用java.util.logging,但这不是必需的 谢谢 **更新** 然而,我发现,它并没有真正告诉你如何通过编程来做同样的事情。建议你看看和 快速浏览一下用户指南,您可以使用jdbcdslog的一个特殊日志包装器包装(修饰)任何JDB

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

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

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

我更愿意使用
java.util.logging
,但这不是必需的

谢谢

**更新**

然而,我发现,它并没有真正告诉你如何通过编程来做同样的事情。

建议你看看和

快速浏览一下用户指南,您可以使用jdbcdslog的一个特殊日志包装器包装(修饰)任何JDBC连接,它将记录到您配置的任何位置

此外,它还说它使用了slf4j,它支持对多个日志引擎进行日志记录,包括java.util.logging,因此您的建议似乎非常可能


(但我不熟悉这个jdbcdslog,所以我不知道如何配置。)

通过配置底层日志引擎发送日志消息的位置来配置日志消息的写入位置。既然您谈论的是slf4j,那就意味着您必须配置它要连接到的东西(在您的例子中是
java.util.logging
系统;此后称为JUL)

不幸的是,JUL是需要配置的比较混乱的系统之一。这就是我要切入重点的地方。在部署的类路径中创建一个名为
logging.properties
(我认为,这是一个容易混淆的部分)的文件,其中包含如下内容:

handlers=java.util.logging.FileHandler
.level=ALL
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
        try {
            // This will load the JDBC Driver
            Class.forName("com.tandem.t4jdbc.SQLMXDriver");
            // Here you will enable the Logging to a file.
            DriverManager.setLogWriter(new PrintWriter(new File("log/dbcLog.log")));
        } catch (ClassNotFoundException e) {
            _logger.error(e.toString());
        }

关于该类的文档描述了您可以配置的内容。

经过大量阅读,以下是我如何使这些内容正常工作的:


注意:有关详细信息,请阅读Oracle文档


这就是神奇之处:

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文档):

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

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
handler实例的methode
setLevel(Level.INFO)

com.my.own.project.logging.handler.MyHandler.foo=Bar
将调用
MyHandler
处理程序实例的方法
setFoo(“Bar”)
。就这样


祝你伐木愉快

作为对@Martin_Schröder答案的更新,它现在也存在,它允许使用slf4j或Log4j2,在Maven存储库中提供,并支持JDBC 4.1(Java 7)。

我正在测量我的JDBC驱动程序的性能,这是一个串联的非/停止数据库,只需在DriverManager中设置LogWriter,如下所示:

handlers=java.util.logging.FileHandler
.level=ALL
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
        try {
            // This will load the JDBC Driver
            Class.forName("com.tandem.t4jdbc.SQLMXDriver");
            // Here you will enable the Logging to a file.
            DriverManager.setLogWriter(new PrintWriter(new File("log/dbcLog.log")));
        } catch (ClassNotFoundException e) {
            _logger.error(e.toString());
        }
登录查询开始工作



作为更新,我还发现对于某些JDBC驱动程序,解决方案无法通过编程(通过代码更改)完成。 例如,我正在为Tandem t4驱动程序使用JDBC驱动程序,尽管我添加了手册中关于启用JDBC跟踪的所有内容,但它只是偶尔工作,并且只是用于查询

然后,我被告知只使用以下参数(作为VM选项):


它只是简单地开始工作。

如果您使用的是Spring,那么它非常方便。您基本上可以围绕任何
数据源
,只需添加日志记录行为

如果您使用的是Java EE,那么P6spy是一个不错的选择:


在幕后,提供了
驱动程序
级别的语句拦截器,这对于Java EE应用程序来说更加方便,因为
数据源
是由应用程序服务器提供的。

是的,我读了很多东西,但我读的内容足以理解基础知识;目前,它正在登录到控制台,但我需要过滤日志,我不知道如何:)哦!这是一个日志框架问题,而不是jdbcdslog问题。(从我从jdbcdslog用户指南中收集的信息来看,它只是寻找slf4j,一切都会自动启动。在这一点上,配置由日志框架处理。)您可能最好使用log4j,它很容易配置,并且有很多好的示例。我更喜欢自己通过log4j登录;我可以使它产生比使用JUL(无需自定义代码)更紧凑、更有用的输出。文件也比较清楚,我同意。我不知道如何让JUL工作,所以我只是通过slf4j+log4j。嗨,Yanick,我遵循了解决方案中的所有步骤,但在启用日志时遇到了问题,你能看看我的帖子并纠正我哪里出错吗。-->谢谢你的信息。我还发现,对于一些JDBC驱动程序来说,解决方案无法通过编程(通过代码更改)完成。例如,我正在为Tandem t4驱动程序使用JDBC驱动程序,尽管我添加了手册中关于启用JDBC跟踪的所有内容,但它只是偶尔工作,并且只是用于查询。。然后,我被告知只使用以下参数:-Dt4sqlmx.T4LogFile=t4sqlmx.log-Dt4sqlmx.T4LogLevel=FINE,它刚刚开始工作。。。。
-Dt4sqlmx.T4LogFile=t4sqlmx.log -Dt4sqlmx.T4LogLevel=FINE