如何用spring启动应用程序初始化log4j?

ktca8awb  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(411)

我有一个spring引导应用程序,我想在这个应用程序中使用log4j。问题是我有一个类似于(log4j2.xml)的jdbc附加器;

  1. <JDBC name="customDBAppender" tableName="mytable">
  2. <ConnectionFactory
  3. class="com.example.logger.ConnectionFactory" method="getConnection" />
  4. ....
  5. </JDBC>

我有一个静态getconnection方法,我需要在这个方法中访问我的数据库属性(用户名、密码)。
我认为log4j使用反射来创建与这个方法的连接(甚至在spring上下文初始化之前),所以我不能用spring注入我的数据库属性。有没有办法注入这个属性?
我的连接工厂类;

  1. public class ConnectionFactory {
  2. public static Connection getConnection() throws SQLException {
  3. Connection connection = new Connection("dbusername", "dbpassword".....)
  4. ....
  5. }
  6. }
qzlgjiam

qzlgjiam1#

正如您所猜测的,您不能这样配置您的jdbc appender。相反,您需要从log4j2配置中删除jdbc appender,并在bean中实际地创建它。例如,在 @Configuration 豆子。
另外请注意,即使这样做,你也应该使用一个连接池而不是一个连接池,否则会降低应用程序的性能。
请按以下步骤操作:

  1. @Configuration
  2. public class JdbcAppenderConfiguration {
  3. @Autowired
  4. private DataSource dataSource;
  5. //Or @PostConstruct
  6. @EventListener
  7. public void handleContextStart(ContextStartedEvent cse) {
  8. final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
  9. final Configuration config = ctx.getConfiguration();
  10. ColumnConfig[] cc = {
  11. ColumnConfig.createColumnConfig(config, "date", null, null, "true", null, null),
  12. ColumnConfig.createColumnConfig(config, "level", "%level", null, null, null, null),
  13. ColumnConfig.createColumnConfig(config, "logger", "%logger", null, null, null, null),
  14. ColumnConfig.createColumnConfig(config, "message", "%message", null, null, null, null),
  15. ColumnConfig.createColumnConfig(config, "throwable", "%ex{short}", null, null, null, null),
  16. ColumnConfig.createColumnConfig(config, "salarie_id", "%X{SALARIE_ID}", null, null, null, null)
  17. } ;
  18. Appender appender = JdbcAppender.createAppender("databaseAppender", "true", null, new Connect(dataSource), "0", "sicdb.bo_log", cc);
  19. appender.start();
  20. config.addAppender(appender);
  21. LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
  22. loggerConfig.addAppender(appender, null, null);
  23. ctx.updateLoggers();
  24. }
  25. }
展开查看全部

相关问题