Июль в SLF4j с драйвером Oracle JDBC
Я пытаюсь перенаправить сообщения java.util.logging, зарегистрированные драйвером oracle jdbc и библиотекой oracle ucp (универсальный пул соединений), но не могу этого сделать.
- Сообщения, зарегистрированные моим приложением с использованием JUL, регистрируются, но те, которые регистрируются библиотеками оракула, не регистрируются.
- Мое намерение здесь - перенаправить сообщения 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;
}
}
2 ответа
Если это поможет. Я взял этот подход в загрузочном приложении Spring, используя ojdbc_g
версия файла jar драйвера:
- Установите системное свойство:
System.setProperty("oracle.jdbc.Trace", "true")
, - Инициализируйте драйвер / источник данных Oracle любым имеющимся у вас механизмом (ручной, Spring, пул conn и т. Д.).
После инициализации источника данных программно установите уровень для "oracle.jdbc"
JUL logger:
Logger ol = Logger.getLogger("oracle.jdbc");
ol.setLevel(Level.FINE);
Оставшаяся часть будет состоять в том, чтобы выяснить, как сопоставить уровни ведения журнала JUL с уровнями ведения журнала SLF4J.
Работал внутри моего загрузочного приложения Spring. Ура!
Это был полный беспорядок, и после того, как я получил некоторую регистрацию, это все еще не работало так хорошо.
Во-первых, вам определенно нужно использовать версию 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;
Пожалуйста, дайте мне знать, если вы решили свои проблемы, как и если это имеет смысл. Есть плохие и противоречивые комментарии во всей сети по этой конкретной проблеме.