2015-11-03 2 views
3

Я использую Spring Boot 1.3.0.RC1 через spring-cloud Brixton.M2 ​​и не смог вытащить весенние загрузочные свойства в logback.xml, что подразумевается этой функцией checkin Support springProperty in logback configurationsНовый механизм поиска пружины Spring и Spring Boot не работает

Я использую .yml-файлы и хочу вытащить имя приложения из bootstrap.yml или application.yml.

Logback-spring.xml:

<configuration> 
     <springProperty scope="context" name="myappName" source="spring.application.name"/> 
     <contextName>${myappName}</contextName> 
     <appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>logs/${myappName}.log</file> 
     ... 
     </appender> 
     ... 
</configuration> 

документация здесь Spring Boot Logback extensions не помогает.

Этот вопрос, связанный с stackoverflow Unable to use Spring Property Placeholders in logback.xml, старше и не работает для меня. Любое понимание было бы полезно.

По желанию, здесь соответствующее дерево зависимостей, который используется

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.3.0.RC1:compile 
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.3.0.RC1:compile 
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.3.0.RC1:compile 
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.3.0.RC1:compile 
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.3.0.RC1:compile 
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.3:compile 
[INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.3:compile 
[INFO] | | | +- org.slf4j:jcl-over-slf4j:jar:1.7.12:compile 
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.12:compile 
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.12:compile 
[INFO] | | \- org.yaml:snakeyaml:jar:1.16:runtime 

Per 2 запроса на информацию, что на самом деле происходит в том, что Logback свойство myappName не получает значение. Я знаю, что это значение становится «myappName_IS_UNDEFINED», и мой файл журнала получает имя «myappName_IS_UNDEFINED.log», а% contextName имеет значение «myappName_IS_UNDEFINED».

+0

Вы должны включать по крайней мере файл управления сборкой (Maven или Gradle). – chrylis

ответ

4

Чтобы обеспечить свой анализ и решение для будущих читателей ... Я попытался с spring.application.name значениями в bootstrap.yml, то application.yml, то application.properties, но никто не работал. Я думал, что это потому, что я использовал logback.xml, но преобразование в logback-spring.xml не привело ни к чему. Рассматривая код, совершенный here, вытягивание значений через this.environment.getProperty(source) зависит от того, когда загружаются источники свойств, и когда интерпретируется файл logback-spring.xml. Не знаю, почему Dave Syer смог заставить его работать, но моя переменная .xml была заполнена до того, как локальные источники свойств добавлены в среду.

Значение равно, заполненному в файле .xml, если я устанавливаю его с помощью SpringApplication.setDefaultProperties(). Следовательно, это маршрут, который я взял.

  • Строили SpringApplicationRunListener
  • В SpringApplicationRunListener.started(), я прочитал в bootstrap.yml (где требуется spring.application.name для всех пользователей каркасных) через new ClassPathResource("/bootstrap.yml")
  • Установите новое свойство, service.log.name в HashMap на основе от стоимости
  • Вызывается SpringApplication.setDefaultProperties() с этим HashMap
  • Тогда я был в состоянии использовать ${myappName} в файле logback-spring.xml

Я признаю, что это не идеальное решение, но которое работает сейчас и, вероятно, продолжит работу для будущих выпусков springBoot. Я открыт для дальнейших идей, но хотел бы предложить решение, которое работало бы для других, имеющих такой же опыт.

+0

потому что слишком рано, что весна не сделала окружающую среду готовой. –

+0

, если вы загружаете свои собственные свойства, почему бы вам просто не добавить его к аргументу в форме '--property = value'? это должно быть более ранним, чем источник свойств по умолчанию и простой. –

0

Это работает для меня, если я поместил «spring.application.name» в «application.properties» (не «bootstrap.properties», потому что система протоколирования инициализирована в фазе, где свойства bootstrap еще недоступны. верить). Я не думаю, что logback позволит вам установить «контекстное» имя, но YMMV.

+0

Все еще не работает для меня. Использование весенней загрузки 1.3.0.RC1 и logback 1.1.3. Пробовал application.properties в/resources и в корневом каталоге. Работает, если я выполняю прямые свойства журнала с помощью этого ''. Параметр contextName не работает в течение половины времени, я продолжаю получать (http://jira.qos.ch/browse/LOGBACK-801). Так что еще что-то подозрительное. – RubesMN

+0

Возможно, вы могли бы обновить свой вопрос с более подробной информацией о том, что на самом деле происходит не так? –

+0

Он работает для меня, если я поместил значение в «application.properties», но не «application.yml». Являются ли файлы yaml обработаны в более поздней точке, а затем файлы свойств? Я использую весеннюю загрузку 1.3.8. –

2

Я нахожусь в Spring Boot 1.3.1, и я столкнулся с той же проблемой.

Наконец-то выяснилось, что свойство должно быть установлено в BOTH application.yml AND bootstrap.yml. Установка его одним или другим не работает. Передача его только в качестве аргумента -D также работает.

Это немного похоже на двойную конфигурацию, особенно если она настроена для каждого профиля.

Возможно, конфигурация журнала необходима в обеих фазах, и значение свойства не переносится.

2

Прежде всего, имя файла конфигурации вашего журнала должно быть помечено как -spring, независимо от того, находится ли файл в формате xml или groovy.

весна, предпочтительный конфигурационный центр, затем аргументы командной строки, затем локальные свойства в bootstrap.yml и все файлы локального имущества.

Если в нескольких конфигурационных файлах имеется много свойств, то первое будет влиять независимо от того, какое значение оно имеет.

, кстати, пожалуйста, убедитесь, что программные параметры регистрации не установлены до EnvironmentPrepared, что приведет к сбросу настроек журнала. Между тем, если есть несколько весенних контекстов, настройки журнала будут сброшены несколько раз для каждого контекста.

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

0

Для меня он работал только с использованием свойства командной строки, например --property.value = asd.

1

Для того, чтобы получить доступ к имени весной приложение, вы должны сначала определить свойство пружины в Logback-spring.xml, как показано ниже:

<springProperty scope="context" name="MyApp" source="com.app.star"/>

Так что если вы обращаетесь к источнику выше, то логически должны быть определены в файле application.yml, как показано ниже:

com: app: star: HelloWorld

# Logging Configurations logging: config: "classpath:logback-spring.xml"


Теперь в logback-spring.xml имя приложения будет указано с именем «HelloWorld», с которым вы можете получить доступ с помощью {MyApp}.

Надеюсь, что приведенное выше объяснение поможет.

0

Это работало для меня после того, как я обновил только в bootstrap.properties. Обновления в application.properties не работают, а также не нужны.

kafka.host.name=xxxxx 
kafka.host.port=9092 

В Logback.xml

<springProperty scope="context" name="kafkaHostName" source="kafka.host.name" /> 

<springProperty scope="context" name="kafkaHostPort" source="kafka.host.port" />

<appender name="asyncXSPKafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender"> 
     <encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder"> 
      <layout class="ch.qos.logback.classic.PatternLayout"> 
       <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> 
      </layout> 
     </encoder> 
     <topic>logstash_logs</topic> 
     <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.RoundRobinKeyingStrategy" /> 
     <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" /> 
     <producerConfig>bootstrap.servers=**${kafkaHostName}:${kafkaHostPort}**</producerConfig> 
     <producerConfig>retries=2</producerConfig> 
    </appender> 
0

Наше решение переименовать logback(-spring).xml до, например,logback-delayed.xml так, что он не будет прочитан до весны Cloud Config, а затем активировать его позже явно из конфигурационного файла в репозитории Cloud Config, например:

logging: 
    config: classpath:logback-delayed.xml 
    prop-to-fill-in-logback-delayed.xml: whatever 
Смежные вопросы