簡體   English   中英

如何使用 Spring 引導應用程序初始化 log4j?

[英]How to initialize log4j with Spring Boot application?

我有一個 Spring 引導應用程序,我想在這個應用程序中使用 log4j。 問題是我有一個 JDBC appender like(log4j2.xml);

<JDBC name="customDBAppender" tableName="mytable">
    <ConnectionFactory
                class="com.example.logger.ConnectionFactory" method="getConnection" />
    ....
</JDBC>

我有一個 static getConnection 方法,我需要在這個方法中訪問我的數據庫屬性(用戶名、密碼)。

我認為 log4j 使用反射來創建與此方法的連接(甚至在 Spring 上下文初始化之前),所以我無法使用 Spring 注入我的數據庫屬性。 有沒有辦法注入這個屬性?

我的 ConnectionFactory class;

public class ConnectionFactory {

    public static Connection getConnection() throws SQLException {
        Connection connection = new Connection("dbusername", "dbpassword".....)
        ....
    }

}

就像您猜到的那樣,您不能以這種方式配置您的 jdbc-appender。 相反,您需要從 log4j2 配置中刪除 jdbc 附加程序,並在 Bean 中實用地創建它。 例如在@Configuration bean 中。

另請注意,即使以這種方式工作,您也應該始終使用連接池而不是單個連接池,否則它確實會降低您的應用程序性能。

因此,請執行以下操作:

@Configuration
public class JdbcAppenderConfiguration {
    @Autowired
    private DataSource dataSource;

    //Or @PostConstruct
    @EventListener
    public void handleContextStart(ContextStartedEvent cse) {
        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final Configuration config = ctx.getConfiguration();
        ColumnConfig[] cc = {
            ColumnConfig.createColumnConfig(config, "date", null, null, "true", null, null),
            ColumnConfig.createColumnConfig(config, "level", "%level", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "logger", "%logger", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "message", "%message", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "throwable", "%ex{short}", null, null, null, null),
            ColumnConfig.createColumnConfig(config, "salarie_id", "%X{SALARIE_ID}", null, null, null, null)
        } ;     
        Appender appender = JdbcAppender.createAppender("databaseAppender", "true", null, new Connect(dataSource), "0", "sicdb.bo_log", cc);
        appender.start();
        config.addAppender(appender);
        LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
        loggerConfig.addAppender(appender, null, null);
        ctx.updateLoggers();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM