РЕДАКТИРОВАТЬ: После нескольких проб и ошибок я обнаружил, что проблема заключается в объявлении Logger
в самом классе Main
.
private static final Logger logger = LogManager.getLogger(Main.class.getName());
Это загружает log4j2. xml, включая все параметры приложения JDB C, до вызова MainMapLookup.setMainArguments()
. Удаление logger
сверху позволяет установить основные аргументы.
Ничего из того, что я пробовал, не сработало, потому что кажется, что мой файл log4j2. xml загружается до того, как main()
моего приложения получает называется. Итак, я закончил взломом класса log4j2 JdbcDatabaseManager
с помощью отражения. Это заменяет имя таблицы непосредственно в операторе SQL.
final var jdbcAppender = (JdbcAppender) loggerContext.getConfiguration().getAppender("AppenderName");
final var jdbcManager = jdbcAppender.getManager();
var field = jdbcManager.getClass().getDeclaredField("sqlStatement");
field.setAccessible(true);
String value = (String) field.get(jdbcManager);
value = value.replace("__DUMMY_TABLE__", prefix + "TaskLog");
field.set(jdbcManager, value);
Имя таблицы определяется так же в файле log4j2. xml:
<JDBC name="AppenderName" tableName="__DUMMY_TABLE__">
It похоже, сработало. Надеюсь, что это полезно для других.