Странное поведение с Spring Boot и Log4J2 - PullRequest
0 голосов
/ 23 октября 2019

У меня возникают странные проблемы при запуске приложения Spring Boot. Он был настроен на использование Log4J2 в качестве своего регистратора (регистратор обратного вызова отключен).

log4j2.xml:

<Configuration status="WARN" monitorInterval="30">
  <Properties>
    <Property name="serviceName">$${sys:service.name}</Property>
    <Property name="serviceId">$${sys:service.id}</Property>

    <Property name="LOG_PATTERN">
      [%d{yyyy-MM-dd HH:mm:ss.SSS}] %t %-5p: %c{2}:%L - %m%n
    </Property>

    <Property name="STATS_PATTERN">
      %m%n
    </Property>

    <Property name="logFile">logs/$${sys:service.name}-$${sys:service.id}</Property>
    <Property name="statsFile">metrics/$${sys:service.name}-$${sys:service.id}_stats.json</Property>
    <!--
    <Property name="logFile">logs/${serviceName}-${serviceId}</Property>
    <Property name="statsFile">metrics/${serviceName}-${serviceId}_stats.json</Property>
    -->
  </Properties>

  <Appenders>
    <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
      <PatternLayout pattern="${LOG_PATTERN}" />
    </Console>

    <RollingFile name="RollingFile" fileName="${logFile}.current-session.log"
      filePattern="${logFile}.%i.log.gz" ignoreExceptions="false">
      <PatternLayout>
        <Pattern>${LOG_PATTERN}</Pattern>
      </PatternLayout>
      <Policies>
        <OnStartupTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="10 MB" />
      </Policies>
      <DefaultRolloverStrategy max="10" />
    </RollingFile>

    <File name="StatsFile" fileName="${statsFile}" append="false">
      <PatternLayout>
        <Pattern>${STATS_PATTERN}</Pattern>
      </PatternLayout>
    </File>
  </Appenders>

  <Loggers>
    <Logger name="<package>.StatsWriter" level="info" additivity="false">
      <AppenderRef ref="StatsFile" />
    </Logger>

    <Root level="info">
      <AppenderRef ref="ConsoleAppender" />
    </Root>
  </Loggers>
</Configuration>

Main Issue

У меня есть некоторая подстановка переменных в файле log4j2.xml, чтобы обеспечить возможность изменения, особенно для имен файлов журнала. Когда я запускаю приложение, файлы журнала создаются в правильном каталоге и, по-видимому, имеют фактическое содержимое журнала. Проблема в том, что они названы неправильно. Например, вместо Client-1.current-session.log файл называется ${sys:service.name}-${sys:service.id}.current-session.log. Очевидно, что подстановка переменных произошла не так, как планировалось.

Свойства service.name и service.id являются параметрами конфигурации Spring Boot, которые в настоящее время определены в соответствующем файле application.yml. Я думал, что свойства в файле будут доступны, но это явно не так.

Есть ли способ сделать свойства application.yml доступными здесь? Если это не выполнимо, каковы другие способы достижения этой цели?

Дополнительный вопрос

Когда я выполняю приложение в своей тестовой среде, яустановить регистратор для вывода на консоль:

<Root level="info">
  <AppenderRef ref="ConsoleAppender" />
</Root>

Когда он выполняется, вывод отображается на консоли, но, как ни странно, файл журнала также создается. Почему это так?

ПРИМЕЧАНИЕ :

Существует элемент SO ( Использовать свойства загрузочного приложения Spring в log4j2.xml ) (этоэто второй ответ), что-то вроде этого, но кажется (как признает автор) своего рода хакером. Я еще не пробовал (пока).

Меня немного смущают ссылки на application- "profile" .yml и log4j2-spring.xml. Я не знаком с этими вариациями этих имен файлов. Каково значение этих вариаций (обоих типов файлов)?

1 Ответ

1 голос
/ 23 октября 2019

Для вашего основного вопроса ваше имя файла log4j2.xml, вместо этого следует использовать log4j2-spring.xml, поскольку таким образом вы позволяете Spring Boot лучше контролировать Log4j2.

Один изПреимущества - это возможность интегрировать отсутствующие переменные. Вероятно, это связано с тем, что при использовании log4j2.xml файлов инициализация log4j2 выполняется до загрузки пружины, а при использовании log4j2-spring.xml Spring Boot инициализируется инициализация log4j2.

Как указано в документации SpringBoot , состояние:

Когда это возможно, мы рекомендуем использовать варианты -spring для вашей конфигурации ведения журнала (например, logback-spring.xml вместо logback.xml). Если вы используете стандартные местоположения конфигурации, Spring не может полностью контролировать инициализацию журнала.

Вы можете взглянуть на эту ветку , открытую парнями с просьбой log4j2.xml против log4j2-spring.xml

На ваш второй вопрос , потому что у вас есть 2 регистратора ... просто так:

  <Loggers>
    <Logger name="<package>.StatsWriter" level="info" additivity="false">
      <AppenderRef ref="StatsFile" />   <---- This one creates your file
    </Logger>

    <Root level="info">
      <AppenderRef ref="ConsoleAppender" />
    </Root>
  </Loggers>

Относительно вашего третьего вопроса :

Я немного запуталсяпо ссылкам на приложение - "профиль" .yml и log4j2-spring.xml. Я не знаком с этими вариациями этих имен файлов. Каково значение этих вариаций (обоих типов файлов)?

Вариация application-"profile".xxx - это способ, который позволяет весенней загрузке принимать различные конфигурации на основе этих файлов профиля. Вы можете запустить свое приложение с параметрами "dev" (локально для базы данных dev), но на производстве вы можете использовать другие параметры. Вы можете управлять тем, как загружать разные профили различными способами, очень распространенным является выполнение вашего приложения, например java -jar -Dspring.profiles.active=prod application.jar

Относительно log4j2-spring.xml, как указано выше, чтобы Spring Boot правильно инициализировал log4j2 (или любой другойиспользуемый инструмент регистрации).

...