2011-06-14 117 views
1

我想重定向由oracle jdbc驱动程序和oracle ucp(通用连接池)库所记录的java.util.logging消息,但无法这样做。JUL到SLF4J与oracle jdbc驱动程序

  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; 
    } 

} 

 

回答

0

这是一个完整的混乱,我得到了一些日志记录后,它仍然没有很好地工作。

首先,您肯定需要使用jar的“_g”版本,它是使用debug选项编译的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; 

请让我知道,如果你解决了你的问题,如何以及是否有任何意义。在这个特定的问题上,所有的网络都有差评和矛盾的评论。

2

如果有帮助。我采取这种做法,在春季启动应用程序,使用ojdbc_g版本的驱动程序jar文件:

  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启动应用程序中工作。干杯!