Невозможно использовать 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" />
) получил все, что ожидалось!
Ответы
Ответ 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 таким образом.