java Log4j2-JDBC Appender
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17769680/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Log4j2-JDBC Appender
提问by MoorthyKS
How to connect jdbc appender in log4j2???? im new to log4j2.0 any one help me to solve this??
如何在 log4j2 中连接 jdbc appender????我是 log4j2.0 的新手,有人帮我解决这个问题吗??
<?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
回答by Remko Popma
Your configuration looks okay. (Similar to the docs http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender)
你的配置看起来没问题。(类似于文档http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender)
What is the problem? Are you getting an error? Do you have an error code or a stack trace?
问题是什么?你有错误吗?你有错误代码或堆栈跟踪吗?
If you're not getting an error but nothing is happening, you can try setting <configuration status="trace"
in your config file. This will output log4j2 internal log messages to the console and may help diagnose the problem.
如果您没有收到错误但没有发生任何事情,您可以尝试<configuration status="trace"
在配置文件中进行设置。这会将 log4j2 内部日志消息输出到控制台,并可能有助于诊断问题。
回答by vivek
I think we can't use DriverManager inside JDBC appender. You need to get connection using JNDI name or create connectionFactory class that have static method which return connection object.
我认为我们不能在 JDBC appender 中使用 DriverManager。您需要使用 JNDI 名称获取连接或创建具有返回连接对象的静态方法的 connectionFactory 类。
Following link will help you. http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender
以下链接将为您提供帮助。 http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender
Here is your modified code, I think it should work.
这是您修改后的代码,我认为它应该可以工作。
<?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
Here is ConnectionFactory.java code. You need to change user, pass and connection as per your database.
这是 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();
}
}
This is working for me. It should work for you also.
这对我有用。它也应该对你有用。
回答by Vit
Try to check the version of Log4j2.
尝试检查Log4j2的版本。
Starting with version 2.11, the library supports DriverManagerConnectionSource - "A quick and dirty way to get off the ground, no connection pooling".
从2.11 版开始,该库支持 DriverManagerConnectionSource -“一种快速而肮脏的起步方式,没有连接池”。
Just for example:
举个例子:
<JDBC name="databaseAppender" tableName="application_log">
<DriverManager connectionString="jdbc:oracle:thin:@//localhost:1521/XE"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="system"
password="system" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
</JDBC>