2011-06-14 120 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啓動應用程序中工作。乾杯!