IBM WebSphere中使用JNDI数据源的Log4j2 JDBC Appender连接异常
问题背景
Spring Boot应用打包为EAR部署在IBM WebSphere上,尝试通过Log4J2 JDBC Appender将日志写入Oracle数据库,使用WebSphere中定义的JNDI数据源jdbc/APPLOGDS,但出现连接异常,无法写入日志。
现有Log4J2配置
<JDBC name="databaseAppender" tableName="tphms_dba.WAS_APP_LOG"> <DataSource jndiName="jdbc/APPLOGDS" /> <Column name="LOG_DATE" isEventTimestamp="true" /> <Column name="LOG_LEVEL" pattern="%level" /> </JDBC>
报错信息
org.apache.logging.log4j.core.appender.AppenderLoggingException: Cannot write logging event; JDBC manager not connected to the database
[06/04/23 16:57:03:753 EDT] 00000057 SystemOut O 2023-04-06 16:57:03,752 server.startup : 1 ERROR Unable to write to database [JdbcManager{name=databaseAppender, bufferSize=0, tableName=WAS_APP_LOG, columnConfigs=[{ name=LOG_DATE, layout=null, literal=null, timestamp=true }, { name=LOG_LEVEL, layout=%level, literal=null, timestamp=false }], columnMappings=[]}] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.AppenderLoggingException: Cannot write logging event; JDBC manager not connected to the database, running=true, [columnConfigs=[{ name=LOG_DATE, layout=null, literal=null, timestamp=true }, { name=LOG_LEVEL, layout=%level, literal=null, timestamp=false }], sqlStatement=insert into tphms_dba.WAS_APP_LOG (LOG_DATE,LOG_LEVEL) values (?,?), factoryData=FactoryData [connectionSource=dataSource{ name=jdbc/APPLOGDS, value=com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@58f6b427 }, tableName=WAS_APP_LOG, columnConfigs=[{ name=LOG_DATE, layout=null, literal=null, timestamp=true }, { name=LOG_LEVEL, layout=%level, literal=null, timestamp=false }], columnMappings=[], immediateFail=false, retry=true, reconnectIntervalMillis=5000, truncateStrings=true], connection=null, statement=null, reconnector=Reconnector [latch=java.util.concurrent.CountDownLatch@baa822a2[Count = 0], shutdown=false], isBatchSupported=true, columnMetaData=null])
排查步骤
1. 验证JNDI数据源可用性
- 登录WebSphere管理控制台,找到
jdbc/APPLOGDS数据源,执行连接测试,确认能正常连接Oracle数据库。 - 检查数据源连接池配置:确认初始连接数、最大连接数参数合理,无连接耗尽情况。
- 确认Oracle数据库实例正常运行,WebSphere服务器与数据库网络连通(可通过telnet测试数据库端口)。
2. 检查Log4J2的JNDI配置与权限
- 确认EAR应用的类加载策略:将Log4J2依赖打包在EAR的lib目录,类加载顺序设置为
PARENT_LAST,避免与WebSphere自带JDBC类冲突。 - 核对JNDI名称:确保配置中的
jndiName与WebSphere定义的完全一致(区分大小写,无拼写错误)。 - 配置资源引用:在WebSphere控制台进入目标EAR应用的资源引用,确认已映射
jdbc/APPLOGDS,若未配置则添加引用并绑定到对应JNDI名称。
3. 验证数据库表与权限
- 确认
tphms_dba.WAS_APP_LOG表存在:检查LOG_DATE为时间戳类型(如TIMESTAMP)、LOG_LEVEL为字符串类型(如VARCHAR2),字段类型与Log4J2写入内容匹配。 - 确认数据库用户权限:确保数据源使用的DB用户拥有该表的INSERT权限,可执行
GRANT INSERT ON tphms_dba.WAS_APP_LOG TO <db_user>;赋予权限。
4. 排查版本兼容性与依赖
- 核对版本兼容性:使用Spring Boot官方推荐的Log4J2版本,确保与Spring Boot、WebSphere版本匹配。
- 检查依赖完整性:确认项目包含
log4j-core、log4j-jdbc-api等必要依赖,无缺失导致的初始化失败。
5. 启用详细日志定位问题
- 在Log4J2配置中添加DEBUG日志:
<Logger name="org.apache.logging.log4j.core.appender.db.jdbc" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger>
- 查看WebSphere的
SystemOut.log和SystemErr.log,获取更详细的连接失败堆栈,定位具体原因(如驱动缺失、认证失败等)。
内容的提问来源于stack exchange,提问作者noor mustufa

