Druid连接池日志配置详解:日志输出优化

Druid连接池日志配置详解:日志输出优化

【免费下载链接】druid 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池 【免费下载链接】druid 项目地址: https://gitcode.com/gh_mirrors/druid/druid

引言

在数据库应用开发中,连接池是提升性能和可靠性的关键组件。Druid(德鲁伊)作为阿里巴巴开源的数据库连接池,不仅提供了高效的连接管理功能,还内置了强大的日志系统,帮助开发者监控和诊断数据库交互问题。本文将详细介绍Druid连接池的日志配置方法,包括日志框架集成、输出优化和实战示例,帮助你打造清晰、高效的数据库访问日志系统。

Druid日志系统架构

Druid的日志功能通过过滤器(Filter)机制实现,支持多种主流日志框架。核心日志过滤器定义在com.alibaba.druid.filter.logging包中,主要包括:

  • Slf4jLogFilter:适配SLF4J(Simple Logging Facade for Java)日志门面
  • Log4jFilter:适配Log4j日志框架
  • Log4j2Filter:适配Log4j2日志框架
  • CommonsLogFilter:适配Apache Commons Logging

这些过滤器的配置信息可在core/src/main/resources/META-INF/druid-filter.properties中查看,该文件定义了Druid支持的所有日志过滤器:

druid.filters.log4j=com.alibaba.druid.filter.logging.Log4jFilter
druid.filters.log4j2=com.alibaba.druid.filter.logging.Log4j2Filter
druid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilter
druid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilter

日志框架集成配置

1. Spring Boot环境配置

在Spring Boot项目中,Druid提供了自动配置支持。通过druid-spring-boot-starterdruid-spring-boot-3-starter,可以轻松集成日志功能。相关配置类如下:

  • druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/stat/DruidFilterConfiguration.java
  • druid-spring-boot-3-starter/src/main/java/com/alibaba/druid/spring/boot3/autoconfigure/stat/DruidFilterConfiguration.java

这些配置类会根据应用的依赖自动注册相应的日志过滤器。例如,当检测到SLF4J依赖时,会自动配置Slf4jLogFilter

public Slf4jLogFilter slf4jLogFilter() {
    Slf4jLogFilter filter = new Slf4jLogFilter();
    // 配置日志参数
    return filter;
}

application.properties中,你可以通过以下前缀配置不同日志框架的参数:

  • SLF4J: spring.datasource.druid.filter.slf4j
  • Log4j: spring.datasource.druid.filter.log4j
  • Log4j2: spring.datasource.druid.filter.log4j2

2. 非Spring环境配置

在非Spring环境中,可以通过编程方式或配置文件手动配置日志过滤器。

编程方式
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("password");

// 添加日志过滤器
dataSource.setFilters("stat,slf4j"); // stat用于统计,slf4j用于日志
配置文件方式

druid.properties中配置:

druid.filters=stat,log4j

日志输出优化

1. 日志级别控制

通过调整日志级别,可以控制日志输出的详细程度。以Log4j为例,在core/src/test/resources/log4j.properties中配置:

# 设置Druid SQL日志级别为DEBUG
log4j.category.druid.sql=DEBUG
# 设置控制台输出级别为DEBUG
log4j.appender.CONSOLE.Threshold=DEBUG
# 设置文件输出级别为INFO
log4j.appender.FILE.Threshold=INFO

2. 日志格式定制

合理的日志格式可以提高日志的可读性和可分析性。以下是一个推荐的Log4j日志格式:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p] %c{1}:%L - %m%n

各字段含义:

  • %d{yyyy-MM-dd HH:mm:ss}:日志时间戳
  • [%-5p]:日志级别(左对齐,占5个字符)
  • %c{1}:日志记录器名称(只显示类名)
  • %L:行号
  • %m%n:日志消息和换行

3. 敏感信息脱敏

Druid日志过滤器提供了敏感信息脱敏功能,可以防止密码等敏感信息泄露。例如,在Slf4jLogFilter中,可以配置需要脱敏的参数:

slf4jLogFilter.setDataSourceLogEnabled(false); // 禁用数据源信息日志
slf4jLogFilter.setStatementExecutableSqlLogEnable(true); // 启用SQL执行日志

实战示例

示例1:Spring Boot集成SLF4J

  1. 添加依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
  1. 配置application.properties
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Druid配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# 启用日志过滤器
spring.datasource.druid.filters=stat,slf4j

# SLF4J日志配置
spring.datasource.druid.filter.slf4j.enabled=true
spring.datasource.druid.filter.slf4j.statement-log-enabled=true
spring.datasource.druid.filter.slf4j.statement-executable-sql-log-enable=true

示例2:非Spring环境集成Log4j

  1. 添加依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
  1. 配置log4j.properties
log4j.rootLogger=INFO, CONSOLE, FILE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p] %c{1}:%L - %m%n

log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.DatePattern=yyyyMMdd'.log'
log4j.appender.FILE.File=logs/druid.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p] %c{1}:%L - %m%n

# Druid SQL日志级别
log4j.category.druid.sql=DEBUG
  1. 配置Druid数据源
public class DruidLogExample {
    public static void main(String[] args) throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        dataSource.setFilters("stat,log4j"); // 添加stat和log4j过滤器
        
        Connection conn = dataSource.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM users");
        
        // 处理结果集...
        
        rs.close();
        stmt.close();
        conn.close();
        dataSource.close();
    }
}

常见问题解决

1. 日志不输出

如果配置了日志过滤器但没有输出日志,可能的原因:

  • 日志框架依赖冲突:检查classpath中是否有多个日志框架的jar包
  • 日志级别设置过高:尝试降低日志级别,如从INFO改为DEBUG
  • 过滤器未正确配置:确保在filters属性中包含了日志过滤器,如slf4jlog4j

2. 日志输出重复

日志重复输出通常是因为多个日志过滤器被同时启用。例如,同时配置了slf4jlog4j过滤器。解决方法是只保留一个日志过滤器:

# 只使用slf4j日志过滤器
spring.datasource.druid.filters=stat,slf4j

总结

Druid连接池提供了灵活强大的日志功能,通过合理配置可以实现对数据库访问的全面监控和诊断。本文介绍了Druid日志系统的架构、集成方法和优化技巧,并提供了实战示例。通过这些配置,你可以根据项目需求定制合适的日志输出策略,提高系统的可维护性和问题排查效率。

主要配置文件和类的位置:

  • 日志过滤器定义:core/src/main/resources/META-INF/druid-filter.properties
  • Spring Boot自动配置:druid-spring-boot-starter/src/main/java/com/alibaba/druid/spring/boot/autoconfigure/stat/DruidFilterConfiguration.java
  • Log4j配置示例:core/src/test/resources/log4j.properties
  • 日志过滤器实现:core/src/main/java/com/alibaba/druid/filter/logging/

掌握这些配置方法,将帮助你更好地利用Druid的日志功能,为数据库应用的稳定运行提供有力保障。

【免费下载链接】druid 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池 【免费下载链接】druid 项目地址: https://gitcode.com/gh_mirrors/druid/druid

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值