如何将此log4j2.xml配置片段转换为log4j2.properties格式?
我不能在我的maven + netbeans项目中使用XML格式,因为我根本无法让log4j2解析并响应log4j2.xml文件 - 无论我将它放在我的项目中,log4j2都会忽略它。
但是,主/资源中的log4j2.properties被解析并响应,所以I -HAVE-使用.properties ...:
<JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG">
<ConnectionFactory class="log4j_tutorial.ConnectionFactory"
method="getDatabaseConnection" />
<Column name="EVENT_DATE" isEventTimestamp="true" />
<Column name="LEVEL" pattern="%level" />
<Column name="LOGGER" pattern="%logger" />
<Column name="MESSAGE" pattern="%message" />
<Column name="THROWABLE" pattern="%ex{full}" />
</JDBC>
我通过官方的Apache Maven log4j工件使用log4j2 2.10.0。
-correct-log4j2.properties配置将与上述100%等效?
我只是花了两天时间才开始让JDBC appender正常工作,所以是时候寻求帮助了。
我当前的log4j2.properties文件可以很好地输出到文件和控制台:
appender.file.type = File
appender.file.name = fileAppender
appender.file.fileName = verdi.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n
appender.out.type = Console
appender.out.name = out
appender.out.layout.type = PatternLayout
appender.out.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n
rootLogger.level = INFO
rootLogger.appenderRef.file.ref = fileAppender
rootLogger.appenderRef.out.ref = out
我只是想在log4j2.properties文件中添加一个JDBC appender - 已经创建了db表,并且我已经根据文档实现了ConnectionSource接口,并且它由一个connectionpooled DataSource支持,根据文档。然而,正式的Apache文档非常含糊,而且非常稀疏,具体细节,特别是在配置方面。
在指定时,我找不到JDBC appender中应该包含哪些元素的正式列表,以及如何在log4j2.properties文件中指定上面显示的XML层次结构。我可以找到JDBC appender配置的所有示例都只是基于-ALWAYS- log4j2.xml / XML的示例。
或者我应该放弃,而是花几天/几周试图让log4j XML配置工作?
谢谢!
我试图做同样的事情,并且真的很惊讶在JDBCAppender属性配置的任何地方找不到任何示例。
我发现了,因为我在OSGI下使用PAX日志记录,我可以通过设置org.ops4j.logging.log4j2.config.file
来引用XML配置文件。有了这个工作,我现在回去找出属性方法,所以我认为这就是你要找的东西:
appender.file.type = File
appender.file.name = fileAppender
appender.file.fileName = verdi.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n
appender.out.type = Console
appender.out.name = out
appender.out.layout.type = PatternLayout
appender.out.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n
appender.db.type = Jdbc
appender.db.name = dbAppender
appender.db.tableName = LOGGING.APPLICATION_LOG
appender.db.cf.type = ConnectionFactory
appender.db.cf.class = log4j_tutorial.ConnectionFactory
appender.db.cf.method = getDatabaseConnection
appender.db.col1.type = Column
appender.db.col1.name = EVENT_DATE
appender.db.col1.isEventTimestamp = true
appender.db.col2.type = Column
appender.db.col2.name = LEVEL
appender.db.col2.pattern = %level
appender.db.col3.type = Column
appender.db.col3.name = LOGGER
appender.db.col3.pattern = %logger
appender.db.col4.type = Column
appender.db.col4.name = MESSAGE
appender.db.col4.pattern = %message
appender.db.col5.type = Column
appender.db.col5.name = THROWABLE
appender.db.col5.pattern = %ex{full}
rootLogger.level = INFO
rootLogger.appenderRef.file.ref = fileAppender
rootLogger.appenderRef.out.ref = out
rootLogger.appenderRef.db.ref = dbAppender
我没有尝试过这个确切的配置,因为我使用的是DataSource而不是ConnectionFactory,但我认为这应该在理论上有效。我希望它有所帮助。
编辑:如果需要数据源而不是连接工厂,请按要求添加数据源定义行:
appender.db.datasource.type = DataSource
appender.db.jndiName = osgi:service/dsName
我试图做同样的事情并得到这个解决方案。 1.创建connectionFactory.java文件
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.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", "aabsUser");
properties.setProperty("password", "aj12fk18");
GenericObjectPool pool = new GenericObjectPool();
DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
"jdbc:mysql://localhost:3306/aabs", 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.在Log4j2.properties中创建条目
name=PropertiesConfig
appenders=db
appender.db.type = Jdbc
appender.db.name = MySQLDatabase
# replace databaseName.tableName
appender.db.tableName =databaseName.tableName
appender.db.cf.type = ConnectionFactory
# change class path and method name
appender.db.cf.class = com.log4j2demo.ConnectionFactory
appender.db.cf.method = getDatabaseConnection
# define column type, column name and value
appender.db.col2.type = Column
appender.db.col2.name = DATE
appender.db.col2.isEventTimestamp = true
appender.db.col3.type = Column
appender.db.col3.name = LOG_LEVEL
appender.db.col3.pattern = %p
appender.db.col4.type = Column
appender.db.col4.name = FILE
appender.db.col4.pattern = %F
#Initialize logger
loggers=db
logger.db.name=com.log4j2demo.Demo
logger.db.level = All
logger.db.appenderRefs.db.ref = MySQLDatabase
#Initialize rootLogger
rootLogger.level =info
rootLogger.appenderRefs = db
rootLogger.appenderRef.db.ref = MySQLDatabase
3.实施记录器
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Demo {
private static Logger log = LogManager.getLogger();
public static void main(String[] args) throws InterruptedException {
log.trace("Entering application.");
log.trace("Trace.");
for (int i = 0; i < 10; i++) {
log.info("Testing Lof For DB");
}
log.debug("Debug.");
log.fatal("Fatal.");
log.log(Level.WARN, "Warn");
int a, b, c;
a = 1;
b = 0;
try {
c = a / b;
log.info("vale of c" + c);
} catch (Exception e) {
log.error("error occur>>" + e);
}
}
}