1

我正在尝试重定向由 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;
    }

}


4

2 回答 2

3

如果有帮助。我在 Spring Boot 应用程序中采用了这种方法,使用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 Boot 应用程序中工作。干杯!

于 2015-02-19T21:38:38.553 回答
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;

请让我知道您是否解决了您的问题,如何解决,以及这些是否有意义。在这个特定问题上,整个网络都有糟糕和相互矛盾的评论。

于 2012-02-10T16:22:17.370 回答