介绍下p6spy这个工具
p6spy 组件,它可以拦截所有执行的 SQL 语句,而不管你使用的是什么 ORM 框架。对于 PrepareStatement 那样带参数(?) 的语句,它会帮你代上相应的参数值。
p6spy 的主页是 http://www.p6spy.com,它支持当前流行的应用服务器,如 JBoss、Orion、Tomcat、WebLogic、WebSphere 等,在http://www.p6spy.com/documentation/install.htm#install 介绍了 p6spy 的安装。其实不用太在意 p6spy 的安装说明,关键是要了解了某个应用服务器本身,要搞清楚的一个问题是“谁在加载 p6spy 包,从哪里加载”,那么配置 p6spy 就不成问题了,你甚至可以把 p6spy 用在独立的 Java 应用程序中。
p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。 属性释义如下:
配置项名称 默认值 配置项意义及相关注意事项
module.log com.p6spy.engine.logging. P6LogFactory 用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。
module.outage com.p6spy.engine.outage. P6OutageFactory 检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。
realdriver 真正的应用系统使用的数据库驱动程序名称。
realdriver2 真正的应用系统使用的第二种备用数据库驱动程序名称。
realdriver3 真正的应用系统使用的第三种备用数据库驱动程序名称。
deregisterdrivers false 显示地把真正的数据库的驱动程序进行反注册掉。取值 true| false
executionthreshold P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才进行记录 Log。
outagedetection false P6Outage 模块是否记录较长时间运行的语句。取值 true| false
outagedetectioninterval P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才进行记录 Log。
filter false 是否过滤 Log,取值 true| false
include 过滤 Log 时所包含的表名列表,以逗号分隔。
exclude 过滤 Log 时所排除的表名列表,以逗号分隔。
sqlexpression 过滤 Log 时的 SQL 表达式名称
autoflush true 是否自动刷新。取值 true| false
dateformat 设置时间的格式,也就是用 Java 的 SimpleDateFormat 程序。
includecategories 显示指定过滤 Log 时包含的分类列表,取值为 error,info,batch,debug,statement,commit,rollback,result 的各种组合。
excludecategories 显示指定过滤 Log 时排队的分类列表,取值同上。
stringmatcher 使用正则表达式来过滤 Log,取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher
stacktrace false 打印堆栈跟踪信息。取值 true| false
stacktraceclass 如果 stacktrace=true,则可以指定具体的类名来进行过滤。
reloadproperties false 监测属性配置文件是否进行重新加载。取值 true| false
reloadpropertiesinterval 60 属性配置文件重新加载的时间间隔,以秒为单位。
useprefix false 是否加上前缀,设置为 true,会加上 p6spy: 作为前缀。取值 true| false
appender com.p6spy.engine.logging. appender.FileLogger 指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger、 com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger
logfile spy.log 指定 Log 的文件名,任何适于操作系统的文件。
append true 指定是否每次是增加 Log,设置为 false 则每次都会先进行清空。取值 true| false
log4j.appender.STDOUT org.apache.log4j.ConsoleAppender 当 appender 为 log4j 时采用的配置,配置如同 Log4J 的相关配置。
log4j.appender.STDOUT.layout org.apache.log4j.PatternLayout 同上
log4j.appender.STDOUT. layout.ConversionPattern p6spy - %m%n 同上
log4j.logger.p6spy INFO,STDOUT Log 级别的设置,取值同 Log4J 的配置
realdatasource 设置数据源 DataSource 的配置名称。
realdatasourceclass 设置数据源 DataSource 的类的全称。
realdatasourceproperties 设置数据源 DataSource 的属性,以分号分隔。
jndicontextfactory 设置 JNDI 数据源的 NamingContextFactory。
jndicontextproviderurl 设置 JNDI 数据源的提供者的 URL。
jndicontextcustom 设置 JNDI 数据源的一些定制信息,以分号分隔。
但是在使用过程中我还是遇到和不少的问题,
1、路径设置的问题,目前这个只支持绝对路径,这点对我们发布系统来说不是很好。
2、生成的日志文件,数据不容易查看。
3、针对sql语句进行的sql过滤,这块容易让我们有点理解有误,属性:“sqlexpression=selcet ” 过滤 Log 时的 SQL 表达式名称,的意思是只显示有select的语句。
针对以上的问题,我修改了下其源码,让其更加符合我现在项目。
1、支持相对路径,以classes 未根路径。例如 :。。。system\WEB-INF\classes;也可以直接写绝对路径。
2、针对日志文件,由于此文件记录量,增加一个log4j中的DailyRollingFileLogger,每天做日志,并且增加一个属性在配置文件中maxfilesize=500(kb),超过此文件的最大值,系统重新生成一个文件。输入的日志格式采用html方式以便系统发布后,也可以方便查询。并且在每个文件中增加一个翻页按钮,但是这个按钮做的不是很好,未判断是否有下一页或者上一页文件。都可以点击。
具体配置
修改数据库驱动改用p6spy。
<property name="driverClassName" value="com.p6spy.engine.spy.P6SpyDriver"></property>
导入p6spy.jar包,然后在项目根路径下添加fileRecord.properties,spy.properties配置文件即可。
jar包大家可以上我资源里面去找。http://download.csdn.net/detail/cheneyfeng3/4414300