JUL到SLF4j与oracle jdbc驱动程序

时间:2011-06-14 16:49:13

标签: oracle jdbc slf4j java.util.logging

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

  1. 我的应用程序使用JUL记录的消息会被记录,但oracle库记录的消息不会被记录。
  2. 我的目的是将JUL消息重定向到Logback,以便通过配置进行更精细的日志记录。即在JUL配置(java.util.config文件)中无法在类级别而不是包级别启用日志记录。
  3. 以下是示例测试代码。您对以上两点有什么建议吗?

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

2 个答案:

答案 0 :(得分:3)

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

  1. 设置系统属性:System.setProperty("oracle.jdbc.Trace", "true")
  2. 使用您拥有的任何机制(手动,Spring,conn池等)初始化Oracle驱动程序/数据源。
  3. 初始化数据源后,以编程方式设置"oracle.jdbc" JUL记录器的级别:

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

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

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

答案 1 :(得分:2)

这是一个完整的混乱,在我得到一些日志后,它仍然没有那么好。

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

如果您解决了问题,如何以及是否有任何理由,请告知我们。关于这一具体问题,所有网络上的评论都很差且相互矛盾。