JDBC вход в файл - PullRequest
       1

JDBC вход в файл

10 голосов
/ 21 апреля 2011

Мне нужно записать все запросы к базе данных Oracle в моем проекте в файл журнала.

Каким было бы хорошее решение для достижения этой цели?Некоторые примеры использования будут оценены.

Я смотрел на SLF4J с jdbcdslog , но я не уверен, как мне войти в файл с ним.Более того, мне нужно было бы «отфильтровать» некоторые журналы (потому что мне не нужно знать, когда вызывается какой-либо метод getxxxx get)

Предпочтительно, я бы предпочел использовать java.util.logging, но этоне требуется.

Спасибо.

** ОБНОВЛЕНИЕ **

Я нашел эту статью Oracle , однакона самом деле не говорит, как программно сделать то же самое.

Ответы [ 6 ]

9 голосов
/ 21 апреля 2011

После долгого прочтения вот как у меня все заработало:


ПРИМЕЧАНИЕ: Для получения дополнительной информации прочитайте Oracle Диагностируемость в JDBC , документ


Properties prop = new Properties();
prop.put ("user", USER);
prop.put ("password", PASS);
// prop.put(propname, propValue);

Class.forName("oracle.jdbc.driver.OracleDriver");

enableLogging(false);

conn = DriverManager.getConnection("jdbc:oracle:thin:@"+HOST+":"+PORT+":"+SID, prop);

А вот и магия:

static private void enableLogging(boolean logDriver) 
throws MalformedObjectNameException, NullPointerException, 
       AttributeNotFoundException, InstanceNotFoundException, 
       MBeanException, ReflectionException, InvalidAttributeValueException, 
       SecurityException, FileNotFoundException, IOException 
{
    oracle.jdbc.driver.OracleLog.setTrace(true);

    // compute the ObjectName
    String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"]+", "");
    javax.management.ObjectName name = new javax.management.ObjectName("com.oracle.jdbc:type=diagnosability,name="+loader);

    // get the MBean server
    javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer();

    // find out if logging is enabled or not
    System.out.println("LoggingEnabled = " + mbs.getAttribute(name, "LoggingEnabled"));

    // enable logging
    mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", true));

    File propFile = new File("path/to/properties");
    LogManager logManager = LogManager.getLogManager();
    logManager.readConfiguration(new FileInputStream(propFile));

    if (logDriver) {
        DriverManager.setLogWriter(new PrintWriter(System.err));
    }
}

Файл свойств (из документации Oracle):

.level=SEVERE
oracle.jdbc.level=INFO
oracle.jdbc.handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=INFO
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

По сути, именно здесь декларируются обработчики

oracle.jdbc.handlers=java.util.logging.ConsoleHandler

Объявляет ConsoleHandler для использования драйвером JDBC Oracle. Здесь можно объявить любое количество обработчиков, по одному на строку, с полным полным именем класса:

oracle.jdbc.handlers=java.util.logging.ConsoleHandler
oracle.jdbc.handlers=java.util.logging.FileHandler
...

Можно использовать собственные обработчики, созданные по тому же правилу. Следующие строки предназначены для настройки обработчика

java.util.logging.ConsoleHandler.level=INFO

вызовет метод setLevel(Level.INFO) экземпляра обработчика ConsoleHandler.

com.my.own.project.logging.handler.MyHandler.foo=Bar

вызовет метод setFoo("Bar") экземпляра обработчика MyHandler. И это все.

Удачной регистрации!

2 голосов
/ 21 апреля 2011

предлагает взглянуть на руководство пользователя jdbcdslog и дискуссионную группу .

Быстрый просмотр руководства пользователя предполагает, что вы можете обернуть (украсить) любое соединение JDBCс помощью одной из специальных оболочек для ведения журналов jdbcdslog, и он будет регистрировать в любом месте, которое вы настраиваете.

Кроме того, он говорит, что использует slf4j, который поддерживает ведение журнала для нескольких механизмов ведения журналов, включая java.util.logging, поэтому то, что вы предлагаете, кажется оченьвозможно.

(Но я не знаком с этим jdbcdslog, поэтому я не уверен, как это настроить.)

0 голосов
/ 03 мая 2016

Если вы используете Spring, то datasource-proxy очень удобен. Вы можете просто обернуть любой DataSource и просто добавить поведение регистрации.

enter image description here

Если вы используете Java EE, то P6spy является хорошей альтернативой:

enter image description here

За кулисами P6spy предоставляет перехватчик операторов на уровне Driver, что гораздо удобнее для приложений Java EE, поскольку сервер приложений предоставляет DataSource.

0 голосов
/ 23 апреля 2015

Я измеряю производительность моего драйвера jdbc, это Tandem Non / Stop DB, и просто устанавливаю LogWriter в DriverManager следующим образом:

        try {
            // This will load the JDBC Driver
            Class.forName("com.tandem.t4jdbc.SQLMXDriver");
            // Here you will enable the Logging to a file.
            DriverManager.setLogWriter(new PrintWriter(new File("log/dbcLog.log")));
        } catch (ClassNotFoundException e) {
            _logger.error(e.toString());
        }

Регистрация запросов началась.


Так же, как обновление , я также обнаружил, что для некоторых драйверов JDBC решение НЕ может быть достигнуто программно (путем изменения кода).Например, я использую драйвер JDBC для драйвера Tandem t4, и хотя я добавил все, что сказано в руководствах о включении трассировки JDBC, он просто работал время от времени и только для запросов ..

ТогдаМне сказали использовать только следующий параметр (в качестве опции VM):

-Dt4sqlmx.T4LogFile=t4sqlmx.log -Dt4sqlmx.T4LogLevel=FINE

И он просто начал работать ..

0 голосов
/ 27 апреля 2013

В качестве обновления к ответу @ Martin_Schröder, он также теперь существует log4jdbc-log4j2 , который позволяет использовать либо slf4j или Log4j2, доступен в репозитории Maven и поддерживает JDBC 4.1 (Java 7).

0 голосов
/ 21 апреля 2011

Вы конфигурируете, куда пишутся сообщения журнала, конфигурируя, куда базовый механизм регистрации отправляет их. Поскольку вы говорите о slf4j, это означает, что вам нужно настроить объект, с которым он соединяется (система java.util.logging в вашем случае; далее она называется JUL).

К сожалению, JUL является одной из наиболее запутанных систем для настройки. Вот где я просто остановлюсь в погоне. Создайте в развернутом пути к классам файл с именем logging.properties (я думаю; это один из сбивающих с толку битов), который содержит что-то вроде этого:

handlers=java.util.logging.FileHandler
.level=ALL
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter

Документация по классу FileHandler описывает вещи, которые вы можете настроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...