跳到主要内容

P6Spy SQL 分析

P6Spy SQL 分析 Starter 为 Spring Boot 应用提供了 SQL 性能分析和监控功能,可以记录和分析应用执行的 SQL 语句,帮助开发者优化数据库性能。

主要特性

  • SQL 日志记录: 记录所有执行的 SQL 语句
  • 性能分析: 分析 SQL 执行时间和性能
  • 参数绑定: 显示 SQL 参数绑定信息
  • 慢查询检测: 检测和记录慢查询
  • 多数据源支持: 支持多个数据源监控
  • 自定义格式化: 支持自定义 SQL 日志格式

安装

Maven 安装

在您的 pom.xml 中添加以下依赖:

<dependency>
<groupId>com.jeeapp.spring.boot</groupId>
<artifactId>p6spy-spring-boot-starter</artifactId>
</dependency>

Gradle 安装

在您的 build.gradle 中添加以下依赖:

implementation 'com.jeeapp.spring.boot:p6spy-spring-boot-starter'

配置

这是一份为您整理的 P6Spy YAML 格式配置说明文档。所有的配置都按照原 properties 文件的模块进行了分类,并统一使用了 p6spy.config 作为前缀。

模块配置

适应 P6Spy 的模块化功能。请注意,核心模块(P6SpyFactory)无法停用,并且此项的更改需要重新加载才能生效。

p6spy:
config:
# 模块列表,以逗号分隔。只有在此列出的模块才会生效。
# 默认值: com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.spy.P6SpyFactory
modulelist: com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

核心属性配置

P6Spy 的核心运行配置,包含日志格式、输出目标以及热加载等功能。

p6spy:
config:
# 需要加载和注册的 JDBC 驱动程序列表,以逗号分隔。(通常为空,JDBC 4.0 会自动注册)
driverlist:

# 是否在每条语句执行后自动 flush 到输出流 (默认是 false)
autoflush: false

# 日期格式,使用 Java 的 SimpleDateFormat。如果未设置,则使用 UNIX 时间戳。
dateformat:

# 是否为每个记录的语句打印堆栈跟踪 (默认是 false)
stacktrace: false
# 如果 stacktrace=true,可在此指定要打印的堆栈跟踪类
stacktraceclass:

# 是否定期重新加载配置文件 (默认 false)
reloadproperties: false
# 重新加载配置文件的间隔时间,单位为秒 (默认 60)
reloadpropertiesinterval: 60

# 指定日志输出的 appender。
# 可选值: Slf4JLogger, StdoutLogger, FileLogger
appender: com.p6spy.engine.spy.appender.FileLogger
# 日志文件的名称 (仅在使用 FileLogger 时有效,默认是 spy.log)
logfile: spy.log
# 是否将日志追加到文件中。如果设置为 false,每次启动都会清空之前的日志 (默认 true)
append: true

# 日志消息的格式化类 (默认: SingleLineFormat)
# 可选值: SingleLineFormat, CustomLineFormat, MultiLineFormat 等
logMessageFormat: com.p6spy.engine.spy.appender.SingleLineFormat

# 自定义日志消息格式 (仅当 logMessageFormat 设置为 CustomLineFormat 时生效)
# 占位符包括: %(connectionId), %(currentTime), %(executionTime), %(category), %(effectiveSql), %(sql) 等
customLogMessageFormat: "%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)"

# java.util.Date 实现的日志记录格式
databaseDialectDateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
# java.sql.Timestamp 实现的日志记录格式
databaseDialectTimestampFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
# boolean 类型的日志记录格式,可选值: boolean, numeric (默认 boolean)
databaseDialectBooleanFormat: boolean
# 二进制数据的日志记录格式 (仅当 excludebinary 为 false 时适用)
# 可选值: PostgreSQLBinaryFormat, MySQLBinaryFormat, HexEncodedBinaryFormat
databaseDialectBinaryFormat: com.p6spy.engine.logging.format.HexEncodedBinaryFormat

# 是否通过 JMX 暴露配置选项 (默认 true)
jmx: true
# JMX 命名空间前缀 (默认空)
jmxPrefix:

# 是否使用纳秒(nanoseconds)而不是毫秒(milliseconds)来测量执行时间 (默认 false)
useNanoTime: false

数据源替换配置

在使用应用服务器配置(且非 Spring Boot 自动装配环境)时,用于替换真实数据源。

p6spy:
config:
# 真实数据源的 JNDI 名称
realdatasource: /RealMySqlDS
# 真实数据源的类名
realdatasourceclass: com.mysql.jdbc.jdbc2.optional.MysqlDataSource

数据源属性配置

为真实数据源提供初始化所需的参数。

p6spy:
config:
# 真实数据源的属性。键值对之间用分号(;)分隔,多组属性用逗号(,)分隔
realdatasourceproperties: port;3306,serverName;myhost,databaseName;jbossdb,foo;bar

JNDI 数据源查找配置

在应用服务器外部使用数据源支持时,用于定义 JNDI 上下文环境。

p6spy:
config:
# 命名环境的工厂类
jndicontextfactory: org.jnp.interfaces.NamingContextFactory
# 提供者 URL
jndicontextproviderurl: localhost:1099
# 自定义 JNDI 上下文属性,键值对用分号分隔,多组属性用逗号分隔
jndicontextcustom: java.naming.factory.url.pkgs;org.jboss.naming:org.jnp.interfaces

日志特定属性配置

用于对日志进行精细化过滤和分类控制。

p6spy:
config:
# 是否开启日志过滤。这是使用 include/exclude/sqlexpression 的前提条件 (默认 false)
filter: false

# 需要包含的字符串列表,逗号分隔 (支持 Java 正则表达式)
include:
# 需要排除的字符串列表,逗号分隔
exclude:
# 用于正则表达式匹配的 SQL 表达式
sqlexpression:

# 需要排除的日志类别列表
# 有效值: error, info, batch, debug, statement, commit, rollback, result, resultset
excludecategories: info,debug,result,resultset,batch

# 是否将二进制值屏蔽为 [binary] 占位符进行记录 (默认 false)
excludebinary: false

# SQL 语句执行耗时的记录阈值,单位为毫秒。
# 只有执行时间超过此值的语句才会被记录到日志中 (默认 0,记录所有)
executionThreshold: 0

停机/超时检测配置

用于检测并记录可能预示数据库中断或性能瓶颈的长时间运行的语句。

p6spy:
config:
# 是否开启慢 SQL/停机检测 (默认 false)
outagedetection: false

# 超时检测时间间隔,单位为秒 (默认 30)
# 只有执行时间超过此时间的 SQL 才会被专门记录。
# 如果一条语句持续执行,将在每次达到该间隔时记录一次 (如间隔为2秒,11秒的查询会在 2,4,6,8,10 秒分别记录)。
outagedetectioninterval: 30

相关资源