diff --git a/pom.xml b/pom.xml index 62ec8b8a..249c5970 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,12 @@ + + + p6spy + p6spy + 3.9.1 + org.springframework.boot diff --git a/src/main/java/cn/lihongjie/coal/config/DruidConfig.java b/src/main/java/cn/lihongjie/coal/config/DruidConfig.java index 87c0a8bd..89e16d8d 100644 --- a/src/main/java/cn/lihongjie/coal/config/DruidConfig.java +++ b/src/main/java/cn/lihongjie/coal/config/DruidConfig.java @@ -1,9 +1,15 @@ package cn.lihongjie.coal.config; import com.alibaba.druid.pool.DruidDataSource; +import com.p6spy.engine.spy.P6DataSource; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; import javax.sql.DataSource; @@ -11,10 +17,31 @@ import javax.sql.DataSource; public class DruidConfig { + @Autowired + Environment environment; @ConfigurationProperties("spring.datasource.druid") @Bean public DataSource druidDataSource() { return new DruidDataSource(); } + + + @Bean + @Primary + public DataSource p6DataSource() { + + DataSource dataSource = druidDataSource(); + + if (ArrayUtils.contains(environment.getActiveProfiles(), "dev")) { + + + return new P6DataSource(dataSource); + } else { + return dataSource; + } + + } + + } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 13a8759a..8a1ba056 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -5,10 +5,12 @@ server: port: 7456 spring: + profiles: + active: dev jpa: hibernate: ddl-auto: update - show-sql: true + show-sql: false datasource: druid: diff --git a/src/main/resources/spy.properties b/src/main/resources/spy.properties new file mode 100644 index 00000000..07eaa3b0 --- /dev/null +++ b/src/main/resources/spy.properties @@ -0,0 +1,253 @@ +################################################################# +# P6Spy Options File # +# See documentation for detailed instructions # +# http://p6spy.github.io/p6spy/2.0/configandusage.html # +################################################################# + +################################################################# +# MODULES # +# # +# Module list adapts the modular functionality of P6Spy. # +# Only modules listed are active. # +# (default is com.p6spy.engine.logging.P6LogFactory and # +# com.p6spy.engine.spy.P6SpyFactory) # +# Please note that the core module (P6SpyFactory) can't be # +# deactivated. # +# Unlike the other properties, activation of the changes on # +# this one requires reload. # +################################################################# +#modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory + +################################################################ +# CORE (P6SPY) PROPERTIES # +################################################################ + +# A comma separated list of JDBC drivers to load and register. +# (default is empty) +# +# Note: This is normally only needed when using P6Spy in an +# application server environment with a JNDI data source or when +# using a JDBC driver that does not implement the JDBC 4.0 API +# (specifically automatic registration). +#driverlist= + +# for flushing per statement +# (default is false) +autoflush=false + +# sets the date format using Java's SimpleDateFormat routine. +# In case property is not set, milliseconds since 1.1.1970 (unix time) is used (default is empty) +#dateformat= + +# prints a stack trace for every statement logged +#stacktrace=false +# if stacktrace=true, specifies the stack trace to print +#stacktraceclass= + +# determines if property file should be reloaded +# Please note: reload means forgetting all the previously set +# settings (even those set during runtime - via JMX) +# and starting with the clean table +# (default is false) +#reloadproperties=false + +# determines how often should be reloaded in seconds +# (default is 60) +#reloadpropertiesinterval=60 + +# specifies the appender to use for logging +# Please note: reload means forgetting all the previously set +# settings (even those set during runtime - via JMX) +# and starting with the clean table +# (only the properties read from the configuration file) +# (default is com.p6spy.engine.spy.appender.FileLogger) +appender=com.p6spy.engine.spy.appender.Slf4JLogger +#appender=com.p6spy.engine.spy.appender.StdoutLogger +#appender=com.p6spy.engine.spy.appender.FileLogger + +# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) +# (used for com.p6spy.engine.spy.appender.FileLogger only) +# (default is spy.log) +#logfile=spy.log + +# append to the p6spy log file. if this is set to false the +# log file is truncated every time. (file logger only) +# (default is true) +#append=true + +# class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat) +logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat + +# Custom log message format used ONLY IF logMessageFormat is set to com.p6spy.engine.spy.appender.CustomLineFormat +# default is %(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine) +# Available placeholders are: +# %(connectionId) the id of the connection +# %(currentTime) the current time expressing in milliseconds +# %(executionTime) the time in milliseconds that the operation took to complete +# %(category) the category of the operation +# %(effectiveSql) the SQL statement as submitted to the driver +# %(effectiveSqlSingleLine) the SQL statement as submitted to the driver, with all new lines removed +# %(sql) the SQL statement with all bind variables replaced with actual values +# %(sqlSingleLine) the SQL statement with all bind variables replaced with actual values, with all new lines removed +customLogMessageFormat=times: %(executionTime)ms %(category) %(sqlSingleLine) + +# format that is used for logging of the java.util.Date implementations (has to be compatible with java.text.SimpleDateFormat) +# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ) +#databaseDialectDateFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ + +# format that is used for logging of the java.sql.Timestamp implementations (has to be compatible with java.text.SimpleDateFormat) +# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ) +#databaseDialectTimestampFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ + +# format that is used for logging booleans, possible values: boolean, numeric +# (default is boolean) +#databaseDialectBooleanFormat=boolean + +# Specifies the format for logging binary data. Not applicable if excludebinary is true. +# (default is com.p6spy.engine.logging.format.HexEncodedBinaryFormat) +databaseDialectBinaryFormat=com.p6spy.engine.logging.format.PostgreSQLBinaryFormat +#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.MySQLBinaryFormat +#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.HexEncodedBinaryFormat + +# whether to expose options via JMX or not +# (default is true) +#jmx=true + +# if exposing options via jmx (see option: jmx), what should be the prefix used? +# jmx naming pattern constructed is: com.p6spy(.)?:name= +# please note, if there is already such a name in use it would be unregistered first (the last registered wins) +# (default is none) +#jmxPrefix= + +# if set to true, the execution time will be measured in nanoseconds as opposed to milliseconds +# (default is false) +#useNanoTime=false + +################################################################# +# DataSource replacement # +# # +# Replace the real DataSource class in your application server # +# configuration with the name com.p6spy.engine.spy.P6DataSource # +# (that provides also connection pooling and xa support). # +# then add the JNDI name and class name of the real # +# DataSource here # +# # +# Values set in this item cannot be reloaded using the # +# reloadproperties variable. Once it is loaded, it remains # +# in memory until the application is restarted. # +# # +################################################################# +#realdatasource=/RealMySqlDS +#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource + +################################################################# +# DataSource properties # +# # +# If you are using the DataSource support to intercept calls # +# to a DataSource that requires properties for proper setup, # +# define those properties here. Use name value pairs, separate # +# the name and value with a semicolon, and separate the # +# pairs with commas. # +# # +# The example shown here is for mysql # +# # +################################################################# +#realdatasourceproperties=port;3306,serverName;myhost,databaseName;jbossdb,foo;bar + +################################################################# +# JNDI DataSource lookup # +# # +# If you are using the DataSource support outside of an app # +# server, you will probably need to define the JNDI Context # +# environment. # +# # +# If the P6Spy code will be executing inside an app server then # +# do not use these properties, and the DataSource lookup will # +# use the naming context defined by the app server. # +# # +# The two standard elements of the naming environment are # +# jndicontextfactory and jndicontextproviderurl. If you need # +# additional elements, use the jndicontextcustom property. # +# You can define multiple properties in jndicontextcustom, # +# in name value pairs. Separate the name and value with a # +# semicolon, and separate the pairs with commas. # +# # +# The example shown here is for a standalone program running on # +# a machine that is also running JBoss, so the JNDI context # +# is configured for JBoss (3.0.4). # +# # +# (by default all these are empty) # +################################################################# +#jndicontextfactory=org.jnp.interfaces.NamingContextFactory +#jndicontextproviderurl=localhost:1099 +#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.naming:org.jnp.interfaces + +#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory +#jndicontextproviderurl=iiop://localhost:900 + +################################################################ +# P6 LOGGING SPECIFIC PROPERTIES # +################################################################ + +# filter what is logged +# please note this is a precondition for usage of: include/exclude/sqlexpression +# (default is false) +#filter=false + +# comma separated list of strings to include +# please note that special characters escaping (used in java) has to be done for the provided regular expression +# (default is empty) +#include= +# comma separated list of strings to exclude +# (default is empty) +#exclude= + +# sql expression to evaluate if using regex +# please note that special characters escaping (used in java) has to be done for the provided regular expression +# (default is empty) +#sqlexpression= + +#list of categories to exclude: error, info, batch, debug, statement, +#commit, rollback, result and resultset are valid values +# (default is info,debug,result,resultset,batch) +#excludecategories=info,debug,result,resultset,batch + +#whether the binary values (passed to DB or retrieved ones) should be logged with placeholder: [binary] or not. +# (default is false) +#excludebinary=false + +# Execution threshold applies to the standard logging of P6Spy. +# While the standard logging logs out every statement +# regardless of its execution time, this feature puts a time +# condition on that logging. Only statements that have taken +# longer than the time specified (in milliseconds) will be +# logged. This way it is possible to see only statements that +# have exceeded some high water mark. +# This time is reloadable. +# +# executionThreshold=integer time (milliseconds) +# (default is 0) +#executionThreshold= + +################################################################ +# P6 OUTAGE SPECIFIC PROPERTIES # +################################################################ +# Outage Detection +# +# This feature detects long-running statements that may be indicative of +# a database outage problem. If this feature is turned on, it will log any +# statement that surpasses the configurable time boundary during its execution. +# When this feature is enabled, no other statements are logged except the long +# running statements. The interval property is the boundary time set in seconds. +# For example, if this is set to 2, then any statement requiring at least 2 +# seconds will be logged. Note that the same statement will continue to be logged +# for as long as it executes. So if the interval is set to 2, and the query takes +# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals). +# +# outagedetection=true|false +# outagedetectioninterval=integer time (seconds) +# +# (default is false) +#outagedetection=false +# (default is 60) +#outagedetectioninterval=30 \ No newline at end of file