JUL到SLF4J与oracle jdbc驱动程序
问题描述:
我想重定向由oracle jdbc驱动程序和oracle ucp(通用连接池)库所记录的java.util.logging消息,但无法这样做。JUL到SLF4J与oracle jdbc驱动程序
- 我的应用程序使用JUL记录的消息被记录,但由oracle库记录的消息没有被记录。
- 我的意图是将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;
}
}
答
这是一个完整的混乱,我得到了一些日志记录后,它仍然没有很好地工作。
首先,您肯定需要使用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;
请让我知道,如果你解决了你的问题,如何以及是否有任何意义。在这个特定的问题上,所有的网络都有差评和矛盾的评论。
答
如果有帮助。我采取这种做法,在春季启动应用程序,使用ojdbc_g
版本的驱动程序jar文件:
- 设置系统属性:
System.setProperty("oracle.jdbc.Trace", "true")
。 - 使用您拥有的任何机制(手动,Spring,conn池等)初始化Oracle驱动程序/数据源。
一旦数据源已被初始化,编程设置为"oracle.jdbc"
JUL记录器级别:
Logger ol = Logger.getLogger("oracle.jdbc");
ol.setLevel(Level.FINE);
其余部分将是找出如何映射JUL日志记录级别到SLF4J日志记录级别。
在我的Spring启动应用程序中工作。干杯!