Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot springboot:配置Log4j2以使用springboot数据源_Spring Boot_Dependency Injection_Log4j2 - Fatal编程技术网

Spring boot springboot:配置Log4j2以使用springboot数据源

Spring boot springboot:配置Log4j2以使用springboot数据源,spring-boot,dependency-injection,log4j2,Spring Boot,Dependency Injection,Log4j2,我正在使用Spring Boot(1.5.9-RELEASE)构建一个应用程序,我想使用log4j2 我想将log4j2配置为使用JDBC连接登录到数据库表 我的问题是,我无法配置log4j2来使用我为Spring Boot配置的数据源 我知道log4j2在Spring Boot启动之前启动,所以我在其中添加了一些代码,在Spring Boot加载之后,它让log4j2重新配置自己 我的问题是我无法从Spring Boot获取数据源的实例 我对依赖注入不是很熟悉,但我假设,由于我需要Spring

我正在使用Spring Boot(1.5.9-RELEASE)构建一个应用程序,我想使用log4j2

我想将log4j2配置为使用JDBC连接登录到数据库表

我的问题是,我无法配置log4j2来使用我为Spring Boot配置的数据源

我知道log4j2在Spring Boot启动之前启动,所以我在其中添加了一些代码,在Spring Boot加载之后,它让log4j2重新配置自己

我的问题是我无法从Spring Boot获取数据源的实例

我对依赖注入不是很熟悉,但我假设,由于我需要Spring Boot来注入数据源,因此我创建DBUtils实例的方法是行不通的。 但是由于log4j2需要一个提供连接的静态方法,所以我不确定如何让它工作


问题: 1) 有人能解释一下我如何使用log4j2Spring Boot
s数据源吗? 或者我必须在DBUtils中创建一个新的连接池,并让log4j2使用该池吗


Spring启动配置 我已经包含了spring-boot-starter-log4j2依赖项,并排除了默认的spring-boot记录器spring-boot-starter日志

application.properties的一部分 这个url是有效的,我只是不在网上发布:p

来自log4j2.xml的JDBC追加器 入门级
我找到了解决这个问题的办法。它并不完美,因为它不使用Spring引导连接池,但它对我来说很有用

步骤如下:

  • 创建@Configuration类,在@PostConstruction期间执行以下步骤
  • 从Spring引导属性中提取数据库配置
  • 以编程方式创建连接池
  • 创建JdbcAppender并将其添加到根记录器

  • 有什么最新消息吗?我有一个类似的问题。我最近发现了一篇文章,展示了如何通过编程方式添加JdbcAppender。它要求您创建自己的连接池,但它可以完美地工作。
    spring.datasource.name=mainDataSource
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    spring.datasource.url=---a valid JDBC URL---
    spring.datasource.username=username
    spring.datasource.password=password
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    
    spring.datasource.tomcat.max-wait=10000
    spring.datasource.tomcat.max-active=50
    spring.datasource.tomcat.test-on-borrow=true
    
    logging.config=classpath:log4j2.xml
    
    <Jdbc
        name="DatabaseAppender"
        tableName="pws_logs">
        <ConnectionFactory
            class="com.test.utils.DBUtils"
            method="getConnection" />
        <Column
            name="log_date"
            isEventTimestamp="true" />
        <Column
            name="log_level"
            pattern="%-5level" />
        <Column
            name="logger"
            pattern="%40.40logger" />
        <Column
            name="line_num"
            pattern="%line" />
        <Column
            name="message"
            pattern="%message" />
        <Column
            name="throwable"
            pattern="%throwable"
            isClob="true" />
    </Jdbc>
    
    package com.test.utils;
    
    import java.sql.Connection;
    
    import javax.sql.DataSource;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class DBUtils {
    
        private static DBUtils dbUtils = null;
    
        @Autowired
        @Qualifier("mainDataSource")
        private DataSource dataSource;
    
        public static Connection getConnection() throws Exception {
            return DBUtils.getDBUtils().getSingleConnection();
        }
    
        private static DBUtils getDBUtils() {
            if (DBUtils.dbUtils == null) {
                DBUtils.dbUtils = new DBUtils();
            }
    
            return DBUtils.dbUtils;
        }
    
        private DataSource getDataSource() throws Exception {
            if (this.dataSource == null) {
                logger.error("Spring-Boot failed to inject database datasource.");
            }
    
            return this.dataSource;
        }
    
        private Connection getSingleConnection() throws Exception {
            try {
                return this.getDataSource().getConnection();
            } catch (Exception e) {
                logger.error("Failed to get database connection.", e);
                throw e;
            }
        }
    
    }
    
    package com.test;
    
    import javax.annotation.PostConstruct;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.core.LoggerContext;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class PaymentWsApplication {
    
        private static Logger logger = null;
    
        @PostConstruct
        public static void initLogger() {
            final LoggerContext loggerContext = LoggerContext.getContext(false);
            loggerContext.reconfigure();
    
            PaymentWsApplication.logger = LogManager.getLogger(PaymentWsApplication.class);
    
            logger.info("********************** Application  started-up.");
        }
    
        public static void main(final String[] args) {
            SpringApplication.run(PaymentWsApplication.class, args);
        }
    
    }