当前位置: 首页 > 面试题库 >

JDBC日志记录到文件

鲁城
2023-03-14
问题内容

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

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

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

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

谢谢。

更新

我找到了这篇Oracle文章,但是它并没有真正告诉您如何以编程方式做同样的事情。


问题答案:

经过大量阅读之后,这就是我使工作正常的方式:

注意:有关
更多信息,请阅读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);

这就是魔术:

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

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

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

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

祝您登录愉快!



 类似资料:
  • 问题内容: 有没有一种方法可以将log4j日志事件写入到也由其他应用程序写入的日志文件中。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化? 问题答案: Log4j有一个SocketAppender,它将事件发送到服务,您可以自己实现或使用与Log4j捆绑在一起的简单实现。 它还支持syslogd和Windows事件日志,这对于尝试将日志输出与非Java应用程序中的事件统一起来可

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一

  • logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用

  • 显然,我不应该再使用ScrapyFileLogObserver(http://doc.scraphy.org/en/1.0/topics/logging.html)。但是我仍然希望能够将我的日志消息保存到一个文件中,并且我仍然希望将所有标准的不稳定的控制台信息也保存到该文件中。 通过阅读如何使用日志模块,下面是我尝试使用的代码: 它运行良好,并将“某些东西”保存到文件中。但是,我在命令提示符窗口中