比如在DruidDataSource的785行(版本1.0.29),日志为LOG.info("{dataSource-" + this.getID() + "} inited"); 如果有多个datasource的话,通过id是比较难识别到底是那个datasource,希望加一下name等信息,或者有个地方打印了id对应的name是什么
原提问者GitHub用户w6et
根据您提供的描述,您希望在Druid连接池的日志中打印数据源的名称或其他信息,以便更好地识别不同的数据源。
在Druid连接池中,默认的日志输出中并没有直接打印数据源的名称。但是,您可以通过以下两种方式来实现日志优化:
1. 使用setName
方法设置数据源的名称:
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setName("myDataSource"); // 设置数据源的名称
您可以在创建DruidDataSource
对象后使用setName
方法设置数据源的名称。然后,在日志中打印数据源的名称时,可以使用getName
方法获取数据源的名称,例如:
LOG.info("{dataSource-" + this.getName() + "} inited");
这样,您就可以在日志中看到类似于{dataSource-myDataSource} inited
的输出。
2. 使用日志过滤器打印更多信息:
Druid连接池提供了多个日志过滤器,可以在日志中打印更多的信息,包括数据源的名称、URL、用户名、密码等。您可以通过设置setFilters
方法来启用日志过滤器。
例如,如果您希望使用log4j进行日志记录,可以设置如下:
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setFilters("log4j"); // 设置日志过滤器
然后,在log4j的配置文件(如log4j.properties或log4j.xml)中,可以使用以下格式化字符串来打印数据源的名称:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %c{1.} %m%n
log4j.logger.com.alibaba.druid.pool.DruidDataSource=DEBUG, stdout
在上述配置中,我们定义了一个名为stdout
的ConsoleAppender
,并使用PatternLayout
格式化器来指定输出日志的格式。在格式化字符串中,您可以使用%c{1.}
来表示输出日志的类名,只显示最后一个点号后的部分。
然后,将com.alibaba.druid.pool.DruidDataSource
的日志级别设置为DEBUG
,并将输出日志的目标设置为stdout
。
这样配置后,在日志中就可以看到类似于[2023-08-02 10:44:22.561] DEBUG DruidDataSource {myDataSource} inited
的输出,其中{myDataSource}
表示数据源的名称。
在Druid连接池中,每个DruidDataSource都有一个唯一的ID,用于标识该数据源。如果您希望在日志中打印数据源的名称或其他信息,可以通过以下几种方式实现:
使用setName方法设置数据源的名称
在创建DruidDataSource对象后,您可以使用setName方法设置数据源的名称。例如:
java
Copy
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setName("myDataSource"); // 设置数据源的名称
在这个例子中,我们通过setName方法设置了数据源的名称为myDataSource。
在日志中打印数据源的名称时,可以使用getName方法获取数据源的名称。例如:
java
Copy
LOG.info("{dataSource-" + this.getName() + "} inited");
在这个例子中,我们使用getName方法获取数据源的名称,并将其插入到日志信息中。
使用setFilters方法设置日志过滤器
Druid连接池提供了多个日志过滤器,可以在日志中打印更多的信息。例如,log4j日志过滤器可以在日志中打印数据源的名称、URL、用户名、密码等信息。
在创建DruidDataSource对象后,您可以使用setFilters方法设置日志过滤器。例如:
java
Copy
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setFilters("log4j"); // 设置日志过滤器
在这个例子中,我们通过setFilters方法设置了日志过滤器为log4j。
在日志中打印数据源的名称时,可以使用[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %c{1.} %m%n格式化字符串,并将其配置到log4j.properties或log4j.xml文件中。例如:
properties
Copy
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %c{1.} %m%n
log4j.logger.com.alibaba.druid.pool.DruidDataSource=DEBUG, stdout
在这个配置中,我们定义了一个名为stdout的ConsoleAppender,并配置了一个PatternLayout格式化器。在PatternLayout格式化器中,我们使用了[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %c{1.} %m%n格式化字符串,其中%c{1.}表示输出日志的类名,只显示最后一个点号后的部分。
在log4j.logger中,我们将com.alibaba.druid.pool.DruidDataSource的日志级别设置为DEBUG,并将输出日志的目标设置为stdout。
这样配置后,在日志中就可以看到类似以下的输出:
Copy
[2023-08-02 10:44:22.561] DEBUG DruidDataSource {myDataSource} inited
在这个输出中,我们可以看到数据源的名称为myDataSource。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。