当前位置: 首页 > 知识库问答 >
问题:

Spring-Boot:配置Log4j2以使用Spring-Boot数据源

严正诚
2023-03-14

我正在使用Spring-Boot(1.5.9-release)构建一个应用程序,我希望将log4j2与它一起使用。

我想配置log4j2以使用JDBC连接记录到数据库表。

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

我的问题是我无法从Spring-Boot获得DataSource的实例。

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

1)有人能解释一下我如何让log4j2使用Spring-Boots数据源吗?还是我必须在DBUtils中创建一个新连接池并让log4j2使用该池?

我包含了spring-boot-starter-log4j2依赖项,并排除了默认的Spring-Boot记录器spring-boot-starter-logging。

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

url是有效的,我只是不把它发布到网上:p

<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);
    }

}

共有1个答案

鲁洋
2023-03-14

我找到了解决这个问题的办法。它不是完美的,因为它没有使用Spring Boot连接池,但它对我是有效的。

http://smasue.github.io/log4j2-spring-database-appender

这些步骤是:

    null
 类似资料:
  • 本文向大家介绍Spring Boot Log4j2的配置使用详解,包括了Spring Boot Log4j2的配置使用详解的使用技巧和注意事项,需要的朋友参考一下 后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发。程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题所在。 Spring Boot 可以集成很

  • 在Spring靴1.5上是否可能。2使用log4j2属性配置而不是xml? 官方spring文档上的日志文档似乎表明只支持xml。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

  • 我是春靴的新手。我有一个跑步Spring靴项目。我想使用log4j2(由于项目限制,我必须使用log4j2本身)将不同级别的所有日志重定向到一个名为'test.log'的日志文件。 ---我的测试API的控制器也有以下测试日志行: ---在我的理解中,我已经在代码中包含了所有必需的内容。但是我面临着这个问题--当我使用API时,只有hibernate调试记录器被添加到test.log中;我在con

  • 我想在application.properties中定义高级文件日志记录,以方便利用我的log4j2.xml文件配置。我的log4j2配置本身运行良好,但是我希望控制日志级别以及application.properties文件中的日志文件和路径信息。我在应用程序的pom文件中有spring-boot-starter-log4j2依赖项。 在log4j2.xml中,我有一个属性 ,其中LOG-DIR

  • 我有多模块spring boot项目,我添加了log4j2作为日志机制,它在启动服务器时抛出下面的异常。 引起原因:java.lang.ClassNotFoundExcoop:非法访问:此Web应用程序实例已被停止。无法加载[org.apache.logging.log4j.message.参数化消息]。以下堆栈跟踪被抛出用于调试目的以及试图终止导致非法访问的线程。在org.apache.cata

  • 问题内容: 我是Spring和Spring Boot的新手。如何配置和使用两个数据源? 例如,这是我对第一个数据源的需求: 应用类别 如何修改以添加另一个数据源?如何将其自动布线以供其他存储库使用? 问题答案: