Log4j2 JDB C Приложение "ОШИБКА Невозможно записать в базу данных" с Spring Boot - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть приложение 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>

1 Ответ

0 голосов
/ 28 февраля 2020

Интересная вещь произошла. Потратив на это 2 недели, я почти сдался - но я просто взломал его.

Я решил обновить Spring Boot до последней версии - теперь все работает. Ранее я использовал 2.0.3, и я только что обновился до 2.2.5. Я предполагаю, что либо была проблема с этой версией Spring Boot, работающей с Log4J, либо путем исправления некоторой зависимости, исправленной самой.

...