Я знаю, что в Log4j2 вы можете динамически устанавливать каталог журналирования, используя что-то вроде:
System.setProperty('logDirectory', getLogDirectoryDynamically());
и используйте это значение в конфигурации Log4j2:
<File name = "File" fileName = "${sys:logDirectory:-.}/my.log" append = "false">
...
</File>
Хорошо, но теперь предположим, что по каким-то причинам у вас НЕТ центрального места (например, нет метода main основного класса), куда вы можете вызвать System.setProperty('logDirectory', ...).
Есть ли способ зарегистрировать некоторые службы (java.util.ServiceLoader), куда вы можете добавить это logDirectory как свойство, возможно, реализовав интерфейс org.apache.logging.log4j.util.PropertySource или что-то подобное?
Цель состоит в том, чтобы при первом вызове LogManager.getLogger(...) ваш дополнительный источник свойства был загружен java.util.ServiceLoader, который содержит значение logDirectory.





Служба PropertySource не используется в файле конфигурации.
Что вы можете реализовать, так это StrLookup. Поиски обнаруживаются не обычным механизмом ServiceLoader, а с помощью механизма плагинов Log4j, поэтому вам необходимо аннотировать класс с помощью:
@Plugin(name = "mylookup", category = StrLookup.CATEGORY)
и скомпилируйте его с помощью обработчика аннотаций, содержащегося в log4j-core (в большинстве случаев он обнаруживается автоматически).
Как только вы это сделаете, вы можете использовать:
<File name = "File" fileName = "${mylookup:logDirectory:-.}/my.log" append = "false">
...
</File>
в вашем файле конфигурации.
Примечание. Имя поиска должно быть написано строчными буквами.
Обычно Log4j использует только файл Log4j2Plugins.dat, созданный обработчиком аннотаций во время компиляции. Он не сканирует путь к классам, если вы не установите атрибут packages для элемента <Configuration>. Отказ от ответственности: я являюсь PMC Apache Logging Services, поэтому знание этих вещей является неотъемлемой частью работы. ;-)
Ты лучший! Даже несмотря на то, что мой вопрос был расплывчатым и указывал в неправильном направлении, вы, тем не менее, показали мне именно то решение, которое я отчаянно искал. Большое спасибо. Кстати, в моем случае обработчик аннотаций не был необходим (как вы уже предположили), думаю, Log4j выполняет некоторое сканирование путей к классам.