2013-07-21 75 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