【发布时间】:2021-03-23 12:36:14
【问题描述】:
我正在尝试在我的 Spring 应用程序中使用这个池化 JDBC 记录器登录 PostgreSQL 数据库。
主要思想来自这里:How to initialize log4j with Spring Boot application?
@Component
public class JdbcAppenderConfiguration implements
ApplicationListener<ContextRefreshedEvent> {
private static Logger LOGGER =
LogManager.getLogger(JdbcAppenderConfiguration.class);
private final DataSource dataSource;
public JdbcAppenderConfiguration(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final ColumnConfig[] cc = {
ColumnConfig.newBuilder()
.setConfiguration(ctx.getConfiguration())
.setName("level")
.setPattern("%level")
.setUnicode(false)
.build()
};
final Appender appender = JdbcAppender
.newBuilder()
.setName("databaseAppender")
.setIgnoreExceptions(false)
.setConnectionSource(new ConnectionFactory(dataSource))
.setTableName("logs2")
.setColumnConfigs(cc)
.build();
appender.start();
ctx.getConfiguration().addAppender(appender);
final LoggerConfig loggerConfig =
ctx.getConfiguration()
.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
loggerConfig.addAppender(appender, null, null);
ctx.updateLoggers();
}
}
和连接工厂:
public class ConnectionFactory extends AbstractConnectionSource {
private final DataSource dataSource;
public ConnectionFactory(DataSource dataSource) {
AssertUtils.notNull(dataSource, "dataSource");
this.dataSource = dataSource;
}
@Override
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
但是在登录时我得到了这个错误:
2020-12-12 08:03:05,860 restartedMain 错误无法写入 数据库 [JdbcManager{name=databaseAppender, bufferSize=0, tableName=logs2, columnConfigs=[{ name=level, layout=%level, 文字=null,时间戳=false }],columnMappings=null}] 用于追加器 [数据库应用程序]。 org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: 在 JDBC 管理器中插入日志事件记录失败: org.postgresql.util.PSQLException:错误:“)”处或附近的语法错误 Pozice: 20 [columnConfigs=[{ name=level, layout=%level, literal=null, timestamp=false }], sqlStatement=insert into logs2 () values (?), 工厂数据=工厂数据 [connectionSource=ConnectionFactory@ca2c455, tableName=logs2, columnConfigs=[{ name=level, layout=%level, 文字=null,时间戳=false }],columnMappings=null, immediateFail=false,重试=true,reconnectIntervalMillis=5000, truncateStrings=true],连接=HikariProxyConnection@1535828764 包装 org.postgresql.jdbc.PgConnection@603942ae, statement=HikariProxyPreparedStatement@1512335087 包装插入到 logs2 () 值 ('INFO'), reconnector=null, isBatchSupported=true, columnMetaData={}]
无效的 SQL INSERT 语句存在问题:
sqlStatement=insert into logs2() values (?),
问题:你知道为什么 log4J 不能正确/完整地编写命令吗?我的代码有什么问题?
【问题讨论】:
标签: java spring-boot log4j2