Из комментариев я понимаю, что желаемый результат следующий:
Возможно, пользователь запустил мою программу из неправильного каталога, и в этом случае я проверяю это и не хочуфайл журнала создан.В этом случае я хочу, чтобы регистрация шла на консоль.После того, как все настройки проверены и завершены, я хочу войти в соответствующий файл.
Основная причина , а не , чтобы пойти с программным решением, заключается в том, что он делает ваш кодзависит от деталей реализации log4j2.Если позднее реализация изменится и вы захотите использовать последнюю версию log4j2, ваш код также должен измениться.Это делает обновление до новой версии log4j2 более трудным и более трудоемким для вас.
Вместо программного изменения конфигурации вы можете использовать RoutingAppender , аналогично тому, как это используется в одном изпримеры на странице часто задаваемых вопросов log4j2 .Таким образом, вы используете функции, предназначенные для публичного использования.На ваш код не влияет внутренняя реализация log4j2, потому что вы просто используете предоставленный общедоступный интерфейс.
Вот пример кода Java, который генерирует сообщения журнала:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class Log4j2DiffAppenderPerCtxVarMain {
private static final Logger LOG = LogManager.getLogger();
public static void main(String[] args){
//This is before validation
LOG.info("This should appear in console only.");
//Check if everything is valid then add the routing key
ThreadContext.put("ROUTINGKEY", "anyValueYouWant");
LOG.info("This should appear in the log file");
}
}
Вотфайл конфигурации log4j2:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Routing name="myAppender">
<Routes pattern="$${ctx:ROUTINGKEY}">
<!-- This route is chosen if ThreadContext has no value for key ROUTINGKEY. -->
<Route key="$${ctx:ROUTINGKEY}">
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Route>
<!-- This route is chosen if ThreadContext has a value for ROUTINGKEY -->
<Route>
<RollingFile name="RollingLog" fileName="myLogFile.log"
filePattern="%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="6"
modulate="true" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="myAppender" />
</Root>
</Loggers>
</Configuration>
Результатом вышеизложенного является то, что первое сообщение журнала отображается только в консоли, как и ожидалось, а второе - только в файле журнала.
Надеюсь, это поможет!