Я думаю, что ты делаешь себе сложнее, чем нужно.Log4j2 предоставляет RoutingAppender , который можно использовать для динамической записи в отдельные файлы журнала без изменения вашего файла конфигурации вообще.
Я создал простой пример, используя некоторые из вашихКонфигурация для иллюстрации того, как вы можете делать то, что вы хотите, без программного изменения файла конфигурации.
Вот класс, содержащий метод main
, который мы будем использовать для запуска log4j2:
package pkg;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class Log4j2DiffFilePerUserMain {
private static final Logger LOG = LogManager.getLogger();
private static final Logger USER_LOG = LogManager.getLogger("Users");
public static void main(String[] args){
ThreadContext.put("userId", "user1");
LOG.info("Now generating user1 log entry");
USER_LOG.info("This should appear in user1 log file");
ThreadContext.put("userId", "user2");
LOG.info("Now generating user2 log entry");
USER_LOG.info("This should appear in user2 log file");
}
}
Обратите внимание, как main
вызывает ThreadContext.put
дважды.Это имитирует выполнение кода разными пользователями.Также обратите внимание, что есть два регистратора - один для «Приложения» и один для «Пользователей».Основываясь на вашей конфигурации, я полагаю, что вы хотели оставить это отдельно.
Вот конфигурация log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingRandomAccessFile
name="Application" immediateFlush="false"
fileName="logs/FixGatewayLogs/Application.log"
append="true"
filePattern="logs/FixGatewayLogs/Application-%d{dd-MM-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p [%t] (%F:%L) - %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy fileIndex="max"
max="20" />
</RollingRandomAccessFile>
<Routing name="UsersAppender">
<Routes pattern="$${ctx:userId}">
<Route>
<RollingRandomAccessFile name="user-${ctx:userId}"
immediateFlush="false"
fileName="logs/FixAcceptorLogs/${ctx:userId}.log"
append="true"
filePattern="logs/FixAcceptorLogs/${ctx:userId}-%d{dd-MM-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %F - %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy fileIndex="max"
max="20" />
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Application" />
</Root>
<Logger name="Users" level="debug"
includeLocation="false" additivity="false">
<AppenderRef ref="UsersAppender" />
</Logger>
</Loggers>
</Configuration>
Как вы можете видеть, я использовал RoutingAppender
очень похожекак это было использовано на странице log4j2 FAQ .Он использует переменную контекста userId
, чтобы динамически решить, в какой журнал отправлять сообщения.
При выполнении вышеуказанного кода и конфигурации создаются 3 файла в 2 папках:
Файл user1.log содержит: 2018-09-18 20:12:42,482 - This should appear in user1 log file
Файл user2.log содержит: 2018-09-18 20:12:42,485 - This should appear in user2 log file
Наконец, журнал приложения содержит:
2018-09-18 20:12:42,480 INFO [main] (Log4j2DiffFilePerUserMain.java:14) - Now generating user1 log entry
2018-09-18 20:12:42,485 INFO [main] (Log4j2DiffFilePerUserMain.java:19) - Now generating user2 log entry
Надеюсь, это поможет вам.