使用 oracle jdbc 驱动程序的 JUL 到 SLF4j

Posted

技术标签:

【中文标题】使用 oracle jdbc 驱动程序的 JUL 到 SLF4j【英文标题】:JUL to SLF4j with oracle jdbc driver 【发布时间】:2011-06-14 16:49:12 【问题描述】:

我正在尝试重定向由 oracle jdbc 驱动程序和 oracle ucp(通用连接池)库记录的 java.util.logging 消息,但无法这样做。

    我的应用程序使用 JUL 记录的消息被记录,但 oracle 库记录的消息没有被记录。 我的意图是将 JUL 消息重定向到 Logback,以便通过配置获得更细粒度的日志记录。即在类级别而不是包级别启用日志记录,我认为这在 JUL 配置(java.util.config 文件)中是不可能的。

以下是示例测试代码。您对以上两点有什么建议吗?

import oracle.ucp.jdbc.PoolDataSourceImpl; import org.slf4j.bridge.SLF4JBridgeHandler; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import java.util.logging.Logger; public class JavaUtilToSlf4jApp private static Logger logger = Logger.getLogger(JavaUtilToSlf4jApp.class.getName()); public static void main(String[] args) SLF4JBridgeHandler.install(); startConnectionPool(); logger.info("Info Message"); private static void startConnectionPool() PoolDataSourceImpl pds = new PoolDataSourceImpl(); try pds.setConnectionPoolName("Pool Name"); pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setConnectionFactoryProperties(getOracleDataSourceProperties()); pds.setDataSourceName("Datasource Name"); pds.setServerName("machine-name"); pds.setPortNumber(1521); pds.setMinPoolSize(1); pds.setMaxPoolSize(1); pds.setMaxIdleTime(1800); pds.setValidateConnectionOnBorrow(true); pds.setUser("user"); pds.setPassword("password"); pds.startPool(); catch (SQLException e) throw new RuntimeException("Cannot create project datasource ", e); try Connection connection = pds.getConnection(); catch (SQLException e) throw new RuntimeException(e); logger.info("Connection established"); private static Properties getOracleDataSourceProperties() Properties p = new Properties(); p.put("driverType", "oci"); p.put("networkProtocol", "tcp"); p.put("serviceName", "servicename"); return p;

【问题讨论】:

【参考方案1】:

如果有帮助的话。我在 Spring 引导应用程序中采用了这种方法,使用了驱动程序 jar 文件的 ojdbc_g 版本:

    设置系统属性:System.setProperty("oracle.jdbc.Trace", "true")。 使用您拥有的任何机制(手动、Spring、conn 池等)初始化 Oracle 驱动程序/数据源。

数据源初始化后,以编程方式设置"oracle.jdbc" JUL 记录器的级别:

Logger ol = Logger.getLogger("oracle.jdbc");
ol.setLevel(Level.FINE);

剩下的部分是弄清楚如何将 JUL 日志记录级别映射到 SLF4J 日志记录级别。

在我的 Spring Boot 应用程序中工作。干杯!

【讨论】:

【参考方案2】:

这完全是一团糟,在我记录了一些日志之后,它仍然无法正常工作。

首先,您肯定需要使用“_g”版本的 jar,这是使用调试选项编译的 jar,并且日志记录已打开。如果你不使用这个驱动程序,那就像从石头上取血一样。

其次,需要添加java参数-Doracle.jdbc.Trace=true

第三,你需要在你的日志文件中定义包(比如logback.xml):

  <logger name="oracle" level="INFO" additivity="false">
    <appender-ref ref="SERVER_FILE" />
  </logger>

这让我得到了以下结果:

11:17:45.393 [UCP-worker-thread-3] INFO  oracle.jdbc.driver - SQL: select count(*) from mytable
11:17:45.956 [main] INFO  oracle.jdbc.driver - SQL: 

        select myfield 
          from mytable 
         where myotherfield='myvalue'      

11:17:46.159 [main] INFO  oracle.jdbc.driver - SQL: begin :1 := dbms_pickler.get_type_shape(:2,:3,:4,:5,:6,:7); end;

如果您解决了您的问题,请告诉我,如何解决,以及其中任何一项是否有意义。在这个特定的问题上,整个网络上都存在糟糕且相互矛盾的 cmets。

【讨论】:

以上是关于使用 oracle jdbc 驱动程序的 JUL 到 SLF4j的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 jdbc、SimpleDateFormat 插入数据库时​​,日期中的年份不正确

SQL题:统计问题(ORACLE)

Oracle jdbc 驱动程序类之间的区别?

如何在 oracle 11 中使用 JDBC 4 驱动程序?

jdbc连接oracle

无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3