2013-07-21 1 views
0

jdbc appender를 log4j2에 연결하는 방법 ???? 메신저 log4j2.0에 새 하나는이 문제를 해결하는 데 도움이 ??Log4j2-JDBC Appender

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="error"> 
    <appenders> 
    <Jdbc name="databaseAppender" tableName="application_log"> 
     <DriverManager url="jdbc:oracle:thin:@//localhost:1521/XE" username="system" password="system" /> 
     <Column name="level" pattern="%level" /> 
     <Column name="logger" pattern="%logger" /> 
     <Column name="message" pattern="%message" /> 
    </Jdbc> 
    </appenders> 
    <loggers> 
    <root level="warn"> 
     <appender-ref ref="databaseAppender"/> 
    </root> 
    </loggers> 
</configuration 

답변

1

구성이 괜찮아 보입니다. (문서 http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender과 유사)

무엇이 문제인가? 오류가 있습니까? 오류 코드 또는 스택 추적이 있습니까?

오류가 발생하지 않지만 아무 것도 일어나지 않는 경우 구성 파일에 <configuration status="trace"을 설정할 수 있습니다. 이렇게하면 log4j2 내부 로그 메시지가 콘솔에 출력되어 문제를 진단하는 데 도움이됩니다.

0

JDBC appender에서 DriverManager를 사용할 수 없다고 생각합니다. JNDI 이름을 사용하여 연결을 가져 오거나 연결 객체를 반환하는 정적 메서드가있는 connectionFactory 클래스를 만들어야합니다.

다음 링크는 도움이됩니다. http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender

다음은 수정 된 코드입니다. 제대로 작동해야합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="error"> 
    <appenders> 
    <Jdbc name="databaseAppender" tableName="application_log"> 
     <ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" /> 
     <Column name="level" pattern="%level" /> 
     <Column name="logger" pattern="%logger" /> 
     <Column name="message" pattern="%message" /> 
    </Jdbc> 
    </appenders> 
    <loggers> 
    <root level="warn"> 
     <appender-ref ref="databaseAppender"/> 
    </root> 
    </loggers> 
</configuration 

다음은 ConnectionFactory.java 코드입니다. 데이터베이스마다 사용자, 패스 및 연결을 변경해야합니다.

package net.example.db; 

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() { 
     Properties properties = new Properties(); 
     properties.setProperty("user", "logging"); 
     properties.setProperty("password", "abc123"); // or get properties from some configuration file 

     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(); 
    } 
} 

이것은 저에게 효과적입니다. 그것은 또한 당신을 위해 작동해야합니다.

+0

스프링 부트 응용 프로그램에서이를 수행하는 방법은 무엇입니까? – Krish