目的:打算将一个访问量不大的项目的每个操作执行的sql存储于日志文件中,方便拷贝sql进行维护。
数据库连接池使用druid,数据库操作使用springjdbc+jpa,日志系统使用slf4j+logback。
因druid的sql语句输出级别是DEBUG,且slf4j不支持日志级别修改,所以只能将druid产生的DEBUG级别日志输出,这样输出级别就要降低为DEBUG,就不能随意写DEBUG级别的日志了。
而且会输出双份日志且将语句粘出来执行时需要手动将一个个参数匹配到对应占位符上,操作不便。
故新建一个Slf4jLogFilter给druid,设置statementExecutableSqlLogEnable属性为true
这样输出的sql日志仅有一条,会将参数自动赋值给占位符并可以格式化sql.可谓一举多得。
druid-configuration如下:
import com.alibaba.druid.filter.logging.Slf4jLogFilter;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author lance
*/
@Data
@ConfigurationProperties(prefix = "spring.datasource")
@Configuration
@EnableTransactionManagement
@SuppressWarnings("unchecked")
public class DruidConfig
{
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
@Bean
public DataSource dataSource()
{
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
d