Мне нужно иметь возможность просматривать журнал запросов приложения, используя пул базы данных. Я обнаружил, что DataSource позволяет мне использовать setLogWriter с PrintWriter.

Я должен обработать информацию, которая будет выводиться, поэтому я не хочу отправлять их в файл. Можно ли прочитать поток информации из источника данных, преобразовав его в строку при ее потоковой передаче?

PoolProperties p = new PoolProperties();
        p.setUrl("jdbc:mysql://" + db_host + ":3306/" + db_name+"?logger=StandardLogger&profileSQL=true");

        p.setDriverClassName("com.mysql.jdbc.Driver");

        p.setUsername(db_user);
        p.setPassword(db_pwd);
        p.setJmxEnabled(true);
        //p.setTestWhileIdle(false);
        p.setTestOnBorrow(true);
        p.setValidationQuery("SELECT 1");
        p.setTestOnReturn(false);
        p.setValidationInterval(30000);
        p.setTimeBetweenEvictionRunsMillis(30000);
        p.setMaxActive(maxActive);
        p.setMaxIdle(5);
        p.setInitialSize(minActive);
        p.setMaxWait(30000);
        p.setRemoveAbandonedTimeout(300);
        p.setMinEvictableIdleTimeMillis(60000);
        p.setMinIdle(3);


        p.setLogAbandoned(true);
        p.setRemoveAbandoned(true);
        p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
                + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
        ds = new DataSource();
        ds.setPoolProperties(p);
        ds.setLogWriter(new PrintWriter(...)); <-- Watch the output live of the PrintWriter

Я хотел бы перенаправить setLogWriter для просмотра функции, которая позволит мне читать и обрабатывать информацию как строку, когда она выводится. Пример:

Public void analyzeLog(String fromPrintWriter){
   if(fromPrintWriter.startsWith("abc"){
       CODE HERE... ETC
    }
}
-1
Alex Hamelin 24 Апр 2017 в 18:20

2 ответа

Лучший ответ

С помощью PipedWriter и PipedReader Вы можете сделать Reader для чтения вывода журнала.

pipe

Применительно к вашему случаю код может выглядеть примерно так:

ds = new DataSource();
ds.setPoolProperties(p);
PipedWriter pipedWriter = new PipedWriter();
ds.setLogWriter(new PrintWriter(pipedWriter));

Runnable runnable = () -> {
    // setup a Reader for reading the DataSource's log output
    try (BufferedReader bufferedReader = new BufferedReader(new PipedReader(pipedWriter))) {
        // start reading from PipedReader, so that writing to PipedWriter will not block
        String line = bufferedReader.readLine();
        while (line != null) {
            analyzeLog(line);
            line = bufferedReader.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
};
new Thread(runnable).start();
0
Thomas Fritsch 24 Апр 2017 в 18:54

Просто напишите себе класс, который расширяет PrintWriter и делегирует другому класс после выполнения вашего кода.

0
Marquis of Lorne 24 Апр 2017 в 19:49
43591923