Вы не можете уничтожить / очистить экземпляры Appender.Но вы можете улучшить имеющееся у вас решение с помощью панели инструментов Log4j2.
Возможна маршрутизация в динамические файлы в Log4j, но в большинстве случаев достаточно Marker
в файле или, по крайней мере, отправная точка дляболее сложная маршрутизация.
Пожалуйста, прочтите его документацию .Особенно последний абзац важен для вашего случая:
При их использовании необходимо учитывать некоторые важные правила, касающиеся маркеров.
- Маркеры должны быть уникальными.Они постоянно регистрируются по имени, поэтому следует позаботиться о том, чтобы маркеры, используемые в вашем приложении, отличались от маркеров в зависимостях приложения, если только этого не требуется.
- Родительские маркеры можно динамически добавлять или удалять.Однако это довольно дорого.Вместо этого рекомендуется идентифицировать родителей при первом получении Маркера, как показано в приведенных выше примерах.В частности, метод set заменяет все маркеры в одной операции, в то время как добавление и удаление действуют одновременно только на один маркер.
- Оценка маркеров с несколькими предками намного дороже, чем у маркеров без родителей.Например, в одном наборе тестов для оценки соответствия Маркера своему деду потребовалось в 3 раза больше времени, чем при оценке самого Маркера.Даже в этом случае оценка маркеров является недорогой по сравнению с разрешением имени класса вызывающего абонента или номера строки.
Тогда вы можете использовать маркер в конфигурации в тех местах, где ожидается шаблон, например:$${marker:}
.Я не использовал это в имени файла, хотя и сомневаюсь, что это работает, но вы можете создать маршрутизацию на основе Маркер .
Я использовал этот простой тестовый скриптобратите внимание на использование Marker
, которое создается для каждой строки из сканера.В вашем случае он будет создан с помощью config или из входных данных сервлета или подобного.
package toTest;
import java.util.Scanner;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
public class TestMe {
private final Logger myOneAndOnlyLogger = LogManager.getLogger("MyCentralName");
public static void main(String[] args) {
new TestMe().doMyThing();
}
private void doMyThing() {
Scanner input = new Scanner(System.in);
String line = "";
while(!line.equals("QUIT")) {
System.out.println("Line: ");
line = input.nextLine();
Marker forThisRound = MarkerManager.getMarker(line);
myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "1");
myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "2");
System.out.println("Line done.");
}
}
}
и это log4j2.properties
(пример файла, который я имел под рукой с маркером в шаблоне):
status = error
name = MarkerExample
#Make sure to change log file path as per your need
property.filename = /tmp/java/marker.log
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
appenders = rolling
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /tmp/java/debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} $${marker:} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MBONE
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20
loggers = rolling
#Make sure to change the package structure as per your application
logger.rolling.name = MyCentralName
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile