2013-07-21 113 views
0

如何連接log4j2中的jdbc appender? 即時通訊新的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