У меня есть приложение Sprint Boot. Я хочу реализовать Log4j для входа на сервер Sql. Я пробовал каждый пример на inte rnet, но, похоже, не взломал его.
Я реализовал его, как показано ниже. Проблема в том, что я получаю ошибки из Log4j:
"ОШИБКА Невозможно записать в базу данных"
В моей фабрике соединений я вижу getDatabaseConnection () метод вызывается. Я проверил, что соединение работает, запустив там команду select. Но когда 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>