加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JDBC记录到文件

发布时间:2020-12-15 00:03:16 所属栏目:Java 来源:网络整理
导读:我需要将所有查询记录到我的项目中的Oracle数据库到一个日志文件. 实现这一点的好办法是什么?一些样品使用将不胜感激. 我已经看过SLF4J与jdbcdslog,但我不知道如何我可以登录到一个文件.此外,我需要“过滤”一些日志(因为我不需要知道什么时候getxxxx方法被
我需要将所有查询记录到我的项目中的Oracle数据库到一个日志文件.

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

我已经看过SLF4J与jdbcdslog,但我不知道如何我可以登录到一个文件.此外,我需要“过滤”一些日志(因为我不需要知道什么时候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

声明ConsoleHandler由Oracle的JDBC驱动程序使用.任何和任何数量的处理程序可以在这里声明,每行一个,类的全限定名称:

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”).就是这样

快乐登录!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读