【问题标题】:Log4j2 - how to convert XML configuration to .properties format for JDBC appenderLog4j2 - 如何为 JDBC appender 将 XML 配置转换为 .properties 格式
【发布时间】:2018-06-05 04:02:37
【问题描述】:

如何将此 log4j2.xml 配置片段转换为 log4j2.properties 格式?

我不能在我的 maven + netbeans 项目中使用 XML 格式,因为我根本无法让 log4j2 解析和响应 log4j2.xml 文件 - 无论我将它放在我的项目中的什么位置,它都会被 log4j2 忽略。

但是 main/resource 中的 log4j2.properties 被解析并响应,所以我 - 必须 - 使用 .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 附加程序 - 已经创建了 db 表,并且我已经按照文档实现了 ConnectionSource 接口,并且它由一个连接池数据源支持,按照文档。然而,官方的 Apache 文档非常模糊且极其稀疏,具体细节尤其是在配置方面。

我找不到指定 JDBC appender 中应包含哪些元素的官方列表,以及如何在 log4j2.properties 文件中指定上述 XML 层次结构。我能找到的所有 JDBC appender 配置示例都是 -ALWAYS- log4j2.xml / XML 的示例。

或者我应该放弃,而是花几天/几周尝试让 log4j XML 配置正常工作?

谢谢!

【问题讨论】:

    标签: java xml jdbc log4j configuration-files


    【解决方案1】:

    我正在尝试做同样的事情,但我真的很惊讶在任何地方都找不到 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
    

    【讨论】:

    • 您愿意分享特定于 DataSource 部分的属性吗?我正在尝试相同但得到一个错误:没有为组件数据源提供类型属性这是相关的配置部分:appender.db.ds.type=DataSource appender.db.ds.jndiName=java:/comp/env/jdbc /LoggerDB
    • @JanPeter - 我已将这些行添加到答案的底部。这些将代替连接工厂配置。我希望这会有所帮助。
    【解决方案2】:

    我试图做同样的事情并得到了这个解决方案。 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);
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2019-01-24
      • 2020-08-30
      相关资源
      最近更新 更多