Механизм поиска переменных среды Log4j2 не работает с атрибутом type - PullRequest
0 голосов
/ 19 марта 2020

Мне нужно настроить макет приложения Log4j2, используя переменную, указанную при запуске приложения. По сути, в соответствии с заданной c рабочей средой мне нужно использовать макет или другой.

В настоящее время я использую конфигурацию XML со следующей настройкой.

  • Я определил переменную env с именем LAYOUT , имеющую тип макета в качестве значения (например: CustomLayout);
  • В файле log4j2.xml я определил следующего аппендера:
    <Appender type="Console" name="ConsoleAppender">
        <PatternLayout type="${env:LAYOUT}" />
    </Appender>

Однако при каждом запуске приложения я получаю следующее сообщение:

ERROR Console contains an invalid element or attribute "${env:LAYOUT}".

Увы, в других разделах того же XML механизм поиска ${env:} работает правильно, например, здесь:

    <Root level="${env:ROOT_LOG_LEVEL:-DEBUG}">
        <AppenderRef ref="ConsoleAppender" />
    </Root>

Мне кажется, что механизм поиска свойств Log4j не работает с атрибутом type. Что я делаю неправильно? Это потому, что атрибут type имеет разное время разрешения?

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Поскольку кажется, что механизм поиска свойств Log4j не работает с атрибутом type, я справился со своим требованием с помощью этого обходного пути:

<Appenders>
    <Console name="AdvancedConsoleAppender" target="SYSTEM_OUT">
        <AdvancedLayout/>
    </Console>
    <Console name="CustomConsoleAppender" target="SYSTEM_OUT">
        <CustomLayout/>
    </Console>
</Appenders>
<Loggers>
    <Root level="${env:ROOT_LOG_LEVEL:-DEBUG}">
        <AppenderRef ref="${env:LOG_APPENDER:-CustomConsoleAppender}" />
    </Root>
</Loggers>

, в основном подход следующий:

  • Я определяю два приложения, каждый из которых содержит свой тип макета;
  • На уровне <AppenderRef> моего <Root> я использую переменную среды, ссылающуюся на имя приложения, которое мне нужно используйте в указанной c среде выполнения.

Благодаря этому обходному пути теперь я могу использовать разные макеты и уровни журналов в разных средах.

0 голосов
/ 20 марта 2020

Здесь есть две проблемы.

  1. Вы указали ${env:LAYOUT}. Когда поиск разрешается до нуля, тогда строковым значением поиска является сама строка - то есть ${env:LAYOUT}. Это означает, что значение LAYOUT не было найдено в качестве переменной среды ОС. Когда вы сконфигурировали уровень в root Logger, вы указали ${env:ROOT_LOG_LEVEL:-DEBUG}, что означает, что если ROOT_LOG_LEVEL не найден в качестве переменной среды, тогда используемое значение должно быть "DEBUG". Если вы хотите, чтобы ваше приложение запускалось, когда переменная среды не определена, вы должны указать значение по умолчанию.
  2. Вы указали атрибут с именем "type" в PatternLayout. Атрибут type можно использовать только в том случае, если в элементе конфигурации указано strict-true. Но в этом случае ваша конфигурация должна выглядеть следующим образом:
    <Appender type="Console" name="ConsoleAppender">
        <Layout type="${env:LAYOUT}" />
    </Appender>

Обратите внимание, что для того, чтобы эта конфигурация работала, каждый из макетов, которые вы можете указать с помощью атрибута type, должен в точности принять одинаковые элементы конфигурации.

...