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

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

  1. 我的应用程序使用 JUL 记录的消息被记录,但 oracle 库记录的消息没有被记录。
  2. 我的意图是将 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; } }

【问题讨论】:

    标签: oracle jdbc slf4j java.util.logging


    【解决方案1】:

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

    1. 设置系统属性:System.setProperty("oracle.jdbc.Trace", "true")
    2. 使用您拥有的任何机制(手动、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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2012-04-04
        • 2011-09-02
        • 1970-01-01
        • 2016-12-10
        • 2013-09-29
        • 2010-10-15
        相关资源
        最近更新 更多