Как настроить p6spy с источником данных в Spring + tomcat 7 + MySQL

Я пытался настроить систему ведения журнала p3spy в моем весеннем проекте на основе maven. Но каждый раз, когда я пытаюсь настроить p3spy по-разному. я получаю всегда ошибки.

Вот мои следующие настройки

Я поместил p6spy-2.3.0.jar, spy.properties и mysql-connector-java-5.1.17.jar в каталог tomcat/lib.

кот/context.xml

<Resource auth="Container" 
            driverClassName="com.mysql.jdbc.Driver" 
            name="jdbc/myDataSource"
            type="javax.sql.DataSource"
            url="jdbc:p6spy:mysql://localhost:3306/coexi?useUnicode=true&amp;characterEncoding=utf-8" 
            username="root"
            password="" 
            maxActive="100" 
            maxIdle="50" />

при использовании этих вышеуказанных настроек.. это дает мне следующую ошибку..

Не удается создать драйвер JDBC класса «com.mysql.jdbc.Driver» для URL-адреса подключения «jdbc:p6spy:mysql://localhost:3306/coexi?useUnicode=true&characterEncoding=utf-8» java.sql.SQLException: нет подходящего драйвера

Здесь я также попытался заменить несколько настроек внутри этих ресурсов.

<Resource auth="Container" 
            driverClassName="com.p6spy.engine.spy.P6SpyDriver" 
            name="jdbc/myDataSource"
            type="javax.sql.DataSource"
            url="jdbc:p6spy:mysql://localhost:3306/coexi?useUnicode=true&amp;characterEncoding=utf-8" 
            username="root"
            password="" 
            maxActive="100" 
            maxIdle="50" />

И, используя этот код, получаю следующую ошибку:

Не удается создать экземпляр com.p6spy.engine.logging.appender.Log4jLogger даже со второй попытки. java.lang.ClassNotFoundException: com.p6spy.engine.logging.appender.Log4jLogger

main/config/PersistanceConfiguration

@Bean
public DataSource dataSource() {
    Context ctx;
    try {
        ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/myDataSource");
    } catch (NamingException e) {
        LOGGER.info("Error to find the database : \"java:comp/env/jdbc/myDataSource\".");
    }
    return null;

tomcat/lib/spy.properties

driverlist=com.mysql.jdbc.Driver

deregisterdrivers=true

includecategories=info, statement
excludecategories=info,debug,result,batch
logfile     = /Users/coexi/Documents/spy.log

append=true

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n

log4j.logger.p6spy=INFO,STDOUT

/основной/ресурсы/logback.xml

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<appender name="GEN_FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/general.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>gen_%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<category name="com.p6spy">
    <priority value="INFO" />
</category>

<logger name="org.hibernate.SQL" additivity="false" >
    <level value="DEBUG" />    
    <appender-ref ref="SQLROLLINGFILE" />
</logger>

<logger name="org.hibernate.type" additivity="false" >
    <level value="TRACE" />
    <appender-ref ref="SQLROLLINGFILE" />
</logger>

<root level="info">
    <appender-ref ref="STDOUT" />
</root>
<root level="error">
    <appender-ref ref="ERRORS_FILE"/>
</root>

основной/ресурсы/log4j.xml.backend

<?xml version="1.0" encoding="UTF-8" ?>

http://jakarta.apache.org/log4j/'>

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="INFO" />
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
</appender>

 <category name="com.p6spy">
    <priority value="INFO" />
  </category>


<logger name="org.hibernate.SQL" additivity="false" >   
 <level value="DEBUG" />    
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

<logger name="org.hibernate.type" additivity="false" >
 <level value="TRACE" />
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="console" />
</root>

Fullstack error.

http://pastebin.com/3LpgtPtr

person princeexpedition    schedule 09.06.2016    source источник
comment
Вы читали документацию? Совершенно ясно, какую комбинацию использовать.   -  person M. Deinum    schedule 09.06.2016
comment
Да, я прочитал и внес некоторые изменения, но теперь получаю другую ошибку, которая кажется относящейся к регистратору. Не удается создать экземпляр com.p6spy.engine.logging.appender.Log4jLogger даже со второй попытки. java.lang.ClassNotFoundException: com.p6spy.engine.logging.appender.Log4jLogger   -  person princeexpedition    schedule 09.06.2016
comment
Вот полная ошибка стека Java. pastebin.com/3LpgtPtr   -  person princeexpedition    schedule 09.06.2016


Ответы (2)


У меня была аналогичная проблема с настройкой p6spy на spring + hibernate + mysql + slf4j + log4j. Моя цель состояла в том, чтобы регистрировать полный sql с параметрами в консоли ide вместо ведения журнала запросов в спящем режиме.

Вставка: p6spy: в URL-адрес конфигурации БД мне не помогла (у меня возникла ошибка при запуске приложения с невозможностью загрузить драйвер БД P6DataSource в пути к классам), и я нашел обходной путь:

вы можете добавить что-то подобное в свой applicationContext.xml или создать bean-компоненты, используя аннотации @Profile(...) и @Configuration spring:

в applicationContext.xml добавьте это:

<beans profile="dev"> 
   <jee:jndi-lookup id="dataSourceReal" jndi-name="db_jndi_name" resource-ref="true"/>
    <bean name="dataSource" class="com.p6spy.engine.spy.P6DataSource">
        <constructor-arg name="delegate" ref="dataSourceReal"/>
    </bean>        
</bean>

<beans profile="!dev">
     <jee:jndi-lookup id="dataSource" jndi-name="db_jndi_name" resource-ref="true"/>  
 </beans>

все URL-адреса базы данных и другие свойства устарели, я только что добавил зависимость maven для p6spy (текущая последняя версия для меня — 3.0.0-alpha-1):

<dependency>
        <groupId>p6spy</groupId>
        <artifactId>p6spy</artifactId>
        <version>3.0.0-alpha-1</version>
</dependency>

добавлены spy.properties со следующими свойствами:

realdriver=com.mysql.jdbc.Driver
appender=com.p6spy.engine.spy.appender.Slf4JLogger

и все работает нормально, но у меня была однострочная регистрация, которую я меняю с помощью моего форматирования на основе спящего режима, например:

package com.my.package.logging;

import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
import org.hibernate.engine.jdbc.internal.Formatter;

public class P6spyHibernateSQLFormatter implements MessageFormattingStrategy {
    public static Formatter formatter = new BasicFormatterImpl();

    @Override
    public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
        return "#" + now + " | took " + elapsed + "ms | " + category + " | connection " + connectionId
                + "\n" + "Hibernate query with params:" + formatter.format(sql)  +";";
    }
}

и добавил средство форматирования в spy.properties:

logMessageFormat=com.my.package.logging.P6spyHibernateSQLFormatter

а также отключаю ведение журнала гибернации... У меня сейчас все работает нормально!

person Max Makarov    schedule 01.09.2016

Вы используете неправильное имя класса для приложения в spy.properties. Регистратор log4j был удален в версии 2.X в пользу регистратора slf4j. Правильное имя класса — com.p6spy.engine.spy.appender.Slf4JLogger.

Дополнительную информацию см. в документах.

Кстати, используемые вами spy.properties предназначены для P6Spy 1.3. Вы должны отказаться от этого файла и заменить его версией 2.X (после редактирования, чтобы включить соответствующие изменения для ваших требований).

person quintonm    schedule 10.06.2016