Spring Boot中Log4j2 JDBC Appender配置PoolingDriver报错求解决方案
Log4j2 JDBC Appender 连接池配置报错解决
问题场景
在Spring Boot应用中配置Log4j2的JDBC Appender时,使用PoolingDriver出现connectionSource为空的错误,但替换为DriverManager可正常运行。
配置文件
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <JDBC name="DB" tableName="log"> <PoolingDriver connectionString="url" userName="username" password="password"/> <Column name="COD_LOG_ID" literal="log0.nextval"/> <Column name="TIM_TIMESTAM" isEventTimestamp="true"/> <Column name="DES_LOGGER" pattern="%c"/> <Column name="COD_JLEVEL" pattern="%level"/> <Column name="DES_LMESSAGE" pattern="%m%n%ex{full}" isClob="true"/> </JDBC> <Async name="Async"> <AppenderRef ref="DB"/> </Async> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Async"/> </Root> </Loggers> </Configuration>
错误信息
2023-06-07 12:36:23,622 main ERROR No ConnectionSource provided: connectionSource 2023-06-07 12:36:23,628 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender for element JDBC org.apache.logging.log4j.core.config.ConfigurationException: Arguments given for element JDBC are invalid: field 'connectionSource' has invalid value 'null' at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.injectFields(PluginBuilder.java:210) at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:121) at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1120) at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1045) at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1037) at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:651) at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:247) at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:293) at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:626) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:699) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:716) at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:270) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155) at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89) at org.apache.commons.logging.LogFactoryService.getInstance(LogFactoryService.java:46) at org.apache.commons.logging.LogFactoryService.getInstance(LogFactoryService.java:41) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:655) at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:196) at com.bbva.eysea.ganbaru.Application.main(Application.java:28)
解决提示
1. 补充连接池依赖
PoolingDriver并非Log4j2核心包自带组件,需引入对应连接池的Log4j集成依赖:
- 若使用Apache DBCP2,添加Maven依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jdbc-dbcp2</artifactId> <version>与你的Log4j2版本一致</version> </dependency> - 若使用HikariCP,添加Maven依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jdbc-hikaricp</artifactId> <version>与你的Log4j2版本一致</version> </dependency>
2. 修正配置结构
PoolingDriver不能直接作为JDBC Appender的子元素,需使用对应的ConnectionSource实现类:
示例:DBCP2连接池配置
<JDBC name="DB" tableName="log"> <PoolingConnectionSource driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_db" userName="username" password="password" maxTotal="10" maxIdle="5"/> <Column name="COD_LOG_ID" literal="log0.nextval"/> <Column name="TIM_TIMESTAM" isEventTimestamp="true"/> <Column name="DES_LOGGER" pattern="%c"/> <Column name="COD_JLEVEL" pattern="%level"/> <Column name="DES_LMESSAGE" pattern="%m%n%ex{full}" isClob="true"/> </JDBC>
示例:HikariCP连接池配置
<JDBC name="DB" tableName="log"> <HikariConnectionSource driverClassName="com.mysql.cj.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost:3306/your_db" username="username" password="password" maximumPoolSize="10"/> <Column name="COD_LOG_ID" literal="log0.nextval"/> <Column name="TIM_TIMESTAM" isEventTimestamp="true"/> <Column name="DES_LOGGER" pattern="%c"/> <Column name="COD_JLEVEL" pattern="%level"/> <Column name="DES_LMESSAGE" pattern="%m%n%ex{full}" isClob="true"/> </JDBC>
3. 验证数据库参数
确保driverClassName、连接URL、用户名、密码与你的数据库环境匹配,比如MySQL 8+需使用com.mysql.cj.jdbc.Driver而非旧版驱动类。
内容的提问来源于stack exchange,提问作者thmasker
相关产品推荐
相关产品推荐

