乐者为王

Do one thing, and do it well.

集成P6Spy到Spring后没有产生日志文件的问题

网上关于集成P6Spy到Spring的帖子说:在Spring的配置文件中添加:

1
2
3
<bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource" destroy-method="close">
    <constructor-arg ref="dataSourceTarget" />
</bean>

然后将原来dataSource定义的id值改为dataSourceTarget:

1
2
3
4
5
6
<bean id="dataSourceTarget" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
</bean>

但是照着这样做了以后却发现没有生成日志文件。

下载P6Spy的源代码进行阅读后找到了问题所在。打开P6Util.java文件,在classPathFile()方法中有这样一条语句:

1
fp = classLoadPropertyFile(Thread.currentThread().getContextClassLoader().getResource(file))

getResource(file)用来读取spy.properties配置文件,file的值就是spy.properties的文件路径。我的syp.properties放在了C:\Tomcat 5.5\webapps\netlink\WEB-INF\classes目录下,所以它返回的值是C:/Tomcat%205.5/webapps/netlink/WEB-INF/classes/spy.properties,Tomcat 5.5中的空格被编码成了%20。然后在classLoadPropertyFile()方法中就直接使用该值来创建File对象。可想而知,肯定创建失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static File classLoadPropertyFile(java.net.URL purl) {
    try {
        if (purl != null) {
            // modified by jayakumar for JDK 1.2 support
            //return new File(purl.getPath());
            return new File(getPath(purl));
            // end of modification
        }
    } catch (Exception e) {
        // we ignore this, since JDK 1.2 does not suppport this method
    }
    return null;
}

在classPathFile()方法中通过判断fp.exists()来决定是否返回日志文件的路径,既然上面创建File对象失败了,那fp.exists()肯定不可能为true了,日志文件也就不可能被创建了。

解决问题的方法超简单,把Tomcat 5.5中的空格去掉就行了。

Comments