如何在Spring+tomcat 7+MySQL中使用数据源配置p6spy



我一直在尝试在基于maven的spring项目上配置p3spy日志记录系统。但每次我尝试以不同的方式配置p3spy时。我总是犯错误。

以下是我的设置

我将p6spy-2.30.jar、spy.properties和mysql-connector-java-5.1.17.jar放在tomcat/lib目录中。

tomcat/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" />

使用上述设置时。。它给了我以下错误。。

无法为连接URL"JDBC:p6sp: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

/main/resources/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>

main/resources/log4j.xl.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错误。

http://pastebin.com/3LpgtPtr

我在spring+hibernate+mysql+slf4j+log4j上配置p6spy时也遇到了类似的问题。

将p6spy:插入数据库配置url对我没有帮助(我在启动应用程序时出错,无法在类路径上加载数据库驱动程序P6DataSource),我找到了解决方法:

您可以在applicationContext.xml中添加类似的内容,或者使用@Profile(…)和@Configurationspring-annotations:创建bean

在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>

所有的db-urls和其他属性都是旧的,我刚刚为p6spy添加了maven依赖项(目前我的最后一个版本是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

一切都很好,但我有单行日志记录,我用基于hibernate的格式化程序更改了它,如下所示:

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

我还禁用了hibernate日志记录。。。现在一切对我来说都很好!

您在spy.properties中为appender使用了错误的类名。log4j记录器在2.X中被删除,取而代之的是slf4j记录器。正确的类名是com.p6spy.engine.spy.appender.Slf4JLogger.

有关更多详细信息,请参阅文档。

BTW-您正在使用的spy.properties适用于P6Spy 1.3。您应该放弃该文件,并将其替换为2.X版本(在进行编辑以包含符合您需求的适当更改之后)。

最新更新