使用 oracle jdbc 驱动程序的 JUL 到 SLF4j
Posted
技术标签:
【中文标题】使用 oracle jdbc 驱动程序的 JUL 到 SLF4j【英文标题】:JUL to SLF4j with oracle jdbc driver 【发布时间】:2011-06-14 16:49:12 【问题描述】:我正在尝试重定向由 oracle jdbc 驱动程序和 oracle ucp(通用连接池)库记录的 java.util.logging 消息,但无法这样做。
-
我的应用程序使用 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;
【问题讨论】:
【参考方案1】:如果有帮助的话。我在 Spring 引导应用程序中采用了这种方法,使用了驱动程序 jar 文件的 ojdbc_g
版本:
-
设置系统属性:
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 Boot 应用程序中工作。干杯!
【讨论】:
【参考方案2】:这完全是一团糟,在我记录了一些日志之后,它仍然无法正常工作。
首先,您肯定需要使用“_g”版本的 jar,这是使用调试选项编译的 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;
如果您解决了您的问题,请告诉我,如何解决,以及其中任何一项是否有意义。在这个特定的问题上,整个网络上都存在糟糕且相互矛盾的 cmets。
【讨论】:
以上是关于使用 oracle jdbc 驱动程序的 JUL 到 SLF4j的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 jdbc、SimpleDateFormat 插入数据库时,日期中的年份不正确