gpt4 book ai didi

java - Log4j2 JDBC Appender "ERROR Unable to write to database"与 Spring Boot

转载 作者:行者123 更新时间:2023-12-01 18:12:19 63 4
gpt4 key购买 nike

我有一个 Sprint Boot 应用程序。我想实现 Log4j 来登录到 Sql Server。我已经尝试了互联网上的每个示例,但似乎无法破解它。

我的实现如下。我遇到的问题是 Log4j 出现错误:

"ERROR Unable to write to database"

在我的连接工厂中,我可以看到正在调用 getDatabaseConnection() 方法。我已经通过在其中运行选择来验证连接是否有效。但是,当Log4j使用它时,Log4j代码中的连接对象为空,因此会抛出此错误。

-- 用法--

public class MyLogger  {

public MyLogger() {}

public static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

public static void info(String message){
logger.info(message);
}
}

-- 连接工厂 --

public class ConnectionFactory  {

private static interface Singleton {
final ConnectionFactory INSTANCE = new ConnectionFactory();
}

private final DataSource dataSource;

private static Properties properties;
static {
properties = new Properties();
ClassLoader cl = ConnectionFactory.class.getClassLoader();
URL url = cl.getResource("config/application.properties");
try {
properties.load(new FileInputStream(url.getPath()));
} catch (IOException e) {
e.printStackTrace();
}
}

private ConnectionFactory() {
dataSource=getDataSource();
}

public DataSource getDataSource()
{
String logDbServer = properties.getProperty("logDb.server");
String logDbInstance = properties.getProperty("logDb.instance");
String logDbDatabase = properties.getProperty("logDb.database");
String logDbUsername = properties.getProperty("logDb.username");
String logDbPassword = properties.getProperty("logDb.password");

Properties properties = new Properties();
properties.setProperty("user", logDbUsername);
properties.setProperty("password", logDbPassword);

GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<>();

String conn = String.format("jdbc:sqlserver://%s;instanceName=%s;database=%s;encrypt=false;trustServerCertificate=true;loginTimeout=30;user=%s;password=%s"
, logDbServer, logDbInstance, logDbDatabase, logDbUsername, logDbPassword);
DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(conn, properties);

new PoolableConnectionFactory(connectionFactory, pool, null, "SELECT 1",
false, false, Connection.TRANSACTION_READ_COMMITTED);

PoolingDataSource p= new PoolingDataSource(pool);
return p;
}

public static Connection getDatabaseConnection() throws SQLException {
Connection conn = Singleton.INSTANCE.dataSource.getConnection();
return conn;
}
}

-- Log4j.xml --

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration name="com.online.sync" status="WARN">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
</Properties>
<Appenders>

<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>

<!-- Database Appender -->

<JDBC name="DatabaseAppender" tableName="Log">
<ConnectionFactory class="au.com.online.sync.service.ConnectionFactory" method="getDatabaseConnection" />
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>

<!-- Async Logger for Info -->
<Async name="InfoAsync">
<AppenderRef ref="Console"/>
<AppenderRef ref="DatabaseAppender" />

</Async>

<!-- Async Logger for Error -->
<Async name="ErrorAsync">
<AppenderRef ref="Console"/>
<AppenderRef ref="DatabaseAppender" />
</Async>

</Appenders>
<Loggers>
<Logger name="error" level ="error">
<AppenderRef ref="ErrorAsync"/>
</Logger>
<Logger name="debug" level="debug">
<AppenderRef ref="Console" />
</Logger>
<Root level="info">
<AppenderRef ref="InfoAsync"/>
</Root>
</Loggers>

</Configuration>

最佳答案

发生了一件有趣的事情。在花了两周时间后,我几乎放弃了 - 但我刚刚破解了它。

我决定将 Spring Boot 升级到最新版本 - 现在一切正常。我之前一直使用2.0.3,刚刚更新到2.2.5。我认为要么是该版本的 Spring Boot 与 Log4J 配合使用存在问题,要么通过升级某些依赖项自行修复。

关于java - Log4j2 JDBC Appender "ERROR Unable to write to database"与 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60445672/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com