Подтвердить что ты не робот

Невозможно использовать Spring Хранилища свойств в logback.xml

У меня есть консольное приложение Spring, использующее Logback. Все свойства (как для приложения, так и для журнала) вытесняются в стандартный файл application.properties в пути к классам. Эти свойства хорошо подбираются в самом приложении, но не отображаются в файле logback.xml. Похоже, что logback.xml обрабатывается до Spring запускается Boot, поэтому EL-заполнители не обрабатываются.

Используя FileNamePattern в качестве примера, в application.properties у меня есть что-то вроде этого:

log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}

а в logback.xml у меня будет следующее:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.logDirectory}${log.filePattern}.log
    </FileNamePattern>
</rollingPolicy>

При запуске приложения я увижу такие ошибки, как:

ERROR in [email protected]:25 - 
RuntimeException in Action for tag [rollingPolicy]
java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken

Подобный код отлично работает в других приложениях Spring (not Spring Boot), поэтому мне интересно, если Spring Загрузка ведет себя немного по-другому.

Решение:

Спасибо за ответ @Gary! Полезно знать о различии между переменными Spring EL и Logback... Я предположил, что это был Spring, который отвечал за разбор этих переменных для меня. У меня сделал элемент, но это заставило меня задуматься.

Мой файл application.properties находился за пределами банки, поэтому Logback не знал, где его найти. Сохраняя мои свойства Spring в моем внешнем файле application.properties, перемещая связанные с журналом свойства в файл application-internal.properties(расположенный внутри) и указывая на "Logback" на , что файл (<property resource="application-internal.properties" />) получил все, что ожидалось!

4b9b3361

Ответ 1

${...} не "Spring EL" в Spring; они являются заполнителями свойств.

Я думаю, что вы путаете логические "переменные" с Spring "Place Placeholders".

Они просто используют один и тот же синтаксис ${...}.

logback ничего не знает о механизме заполнитель свойств Spring и наоборот. Вам нужно настроить переменные журнала в соответствии с документацией по протоколу, а не в application.properties/application.yml, которая строго представляет собой концепцию Spring (boot).

EDIT:

После быстрого просмотра документов журнала, добавив

<property resource="application.properties" />

к logback.xml должен работать.

Ответ 2

Так как Spring Boot 1.3 у вас есть лучший способ получить свойства Spring в вашей конфигурации журнала spring.xml:

Теперь вы можете просто добавить элемент "springProperty".

<springProperty name="destination" source="my.loggger.extradest"/>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${destination}</file>
            ...
        </file>
    </appender>

https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f

edit: спасибо Anders

Ответ 3

Как уже было сказано выше, вы можете получить доступ к свойствам загрузки spring с помощью элемента <springProperty>... но нужно иметь в виду, что файл конфигурации журнала должен иметь имя logback-spring.xml, он не работает, если вы назовете файл logback.xml (я использую spring-boot 1.3.5.RELEASE)

Ответ 4

Вышеупомянутые решения работают в основном для bootrap.properties. Тем не менее, единственный способ использовать свойства удаленного сервера Spring Config Server в конфигурации logback, которые я нашел в настоящее время, - это применять их программно:

@Component
public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {

    @Autowired protected Environment environment;

    @Override
    public void onApplicationEvent(EnvironmentChangeEvent event) {
        // enviroment here has already loaded all properties and you may alter logback config programatically
        ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    }


}

Здесь - хороший пример того, как настраивать logback с новым appender таким образом.