1

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

这是我的以下设置

我将 p6spy-2.3.0.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:p6spy:mysql://localhost:3306/coexi?useUnicode=true&characterEncoding=utf-8”创建类“com.mysql.jdbc.Driver”的 JDBC 驱动程序 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

主/配置/持久性配置

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

主/资源/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>

全栈错误。

http://pastebin.com/3LpgtPtr
4

2 回答 2

3

我在spring + hibernate + mysql + slf4j + log4j上配置p6spy时遇到了类似的问题 我的目标是使用参数将完整的 sql 记录到 ide 控制台而不是 hibernate 查询日志记录。

插入 :p6spy: 到 db config url 对我没有帮助(我在启动应用程序时遇到错误,无法在类路径上加载 db driver P6DataSource),我找到了解决方法:

您可以在 applicationContext.xml 中添加与此类似的内容,或使用 @Profile(...) 和 @Configuration spring 注释创建 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 url 和其他属性都是旧的,我刚刚为 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

一切正常,但我有单行日志记录,我使用基于休眠格式的格式化程序进行更改,如下所示:

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

而且我还禁用了休眠日志记录...现在对我来说一切正常!

于 2016-09-01T13:12:55.090 回答
2

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

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

顺便说一句 - 您使用的 spy.properties 用于 P6Spy 1.3。您应该放弃该文件并将其替换为 2.X 版本(在编辑以包含您的要求的适当更改之后)。

于 2016-06-10T14:59:58.590 回答