log4j2 JDBC manager не может подключиться к базе данных
Я пытаюсь настроить log4j v2 с mysql, но он возвращает эту ошибку:
2014-08-01 15:35:24,819 ERROR Unable to write to database [jdbcManager{ description=databaseAppender, bufferSize=0, connectionSource=factory{ public static java.sql.Connection it.prisma.presentationlayer.webui.ConnectionFactory.getDatabaseConnection() }, tableName=logs, columns=[ { name=message, layout=%message, literal=null, timestamp=false } ] }] for appender [databaseAppender]. org.apache.logging.log4j.core.appender.AppenderLoggingException: Cannot write logging event or flush buffer; JDBC manager cannot connect to the database.
Caused by: java.sql.SQLException: Failed to obtain connection from factory method.
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://10.41.1.68:3306/test
Моя конфигурация аналогична doc , с той лишь разницей, что:
new PoolableConnectionFactory(connectionFactory, pool, null, "SELECT 1", false, false, Connection.TRANSACTION_READ_COMMITTED);
Я думаю, что мой tomcat7 хорошо настроен, потому что я могу войти с log4j v1.
1 ответ:
ОК решение таково:
1-создание класса фабрики соединений
import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnection; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.pool.impl.GenericObjectPool; public class ConnectionFactory { private static interface Singleton { final ConnectionFactory INSTANCE = new ConnectionFactory(); } private final DataSource dataSource; private ConnectionFactory() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(0); } Properties properties = new Properties(); properties.setProperty("user", "root"); properties.setProperty("password", "root"); GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>(); DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory( "jdbc:mysql://example.org:3306/exampleDb", properties ); new PoolableConnectionFactory(connectionFactory, pool, null, "SELECT 1", 3, false, false, Connection.TRANSACTION_READ_COMMITTED); this.dataSource = new PoolingDataSource(pool); } public static Connection getDatabaseConnection() throws SQLException { return Singleton.INSTANCE.dataSource.getConnection(); } }
2-создайте файл конфигурации в src / main / resources с именем log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="TRACE" monitorInterval="30"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> <JDBC name="databaseAppender" tableName="logs"> <ConnectionFactory class="my.pack.ConnectionFactory" method="getDatabaseConnection" /> <!-- <Column name="id" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" /> --> <Column name="date" isEventTimestamp="true" /> <Column name="level" pattern="%level" /> <Column name="message" pattern="%message" /> <Column name="class" pattern="%class" /> </JDBC> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Console" /> <AppenderRef ref="databaseAppender" /> </Root> </Loggers> </Configuration>
3-создайте таблицу, подобную этой:
4-Добавить mysql connector к {tomcat}/bin