2016-09-17 2 views
6

Я использую проект весеннего ботинка.Как вставить активный профиль пружины в журнал

Окружающая среда:

ch.qos.logback:logback-core:jar:1.1.5 
ch.qos.logback:logback-classic:jar:1.1.5 
org.springframework.boot:spring-boot-starter-logging:jar:1.3.3.RELEASE 

В моем проекте я использую свойство с application.yml (приложение-dev.yml и прикладным production.yml)

С расширением Spring Logback начинается до весны Я не могу вставить файл spring.profiles.active в файл logback.xml.

Это упрощенная версия моего файла logback.xml:

<configuration scan="true"> 

    <property name="LOG_PATH" value="/var/log/" /> 
    <property name="APP_NAME" value="xyz" /> 
    <property name="PROFILE" value="-${spring.profiles.active}" /> 
    <property name="CHARSET" value="utf-8" /> 
    <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> 

    <appender name="APP-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 
     <encoder> 
     <charset>${CHARSET}</charset> 
     <Pattern>${PATTERN}</Pattern> 
     </encoder> 
    </appender> 

    <logger name="a.b.c" level="INFO"> 
     <appender-ref ref="APP-FILE" /> 
    </logger> 

    <root level="INFO"> 
     <appender-ref ref="APP-FILE"/> 
    </root> 

PROFILE Я ищу является собственностью spring.profiles.active.

Моя цель состоит в том, чтобы иметь файл журнала на каталог /вар/LOG в файлы хуг-DEV или хуг производство но я получаю АБВ-spring.profiles.active_IS_UNDEFINED.log вместо конечно ,

Подходы:

1 - Использование компонента, как:

@Component 
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> { 

// inject spring profile active into logback.xml 

} 

не работает, конечно, так как расширение Logback весна начинается до применения Spring загрузки.

2 - Используя свойство на logback.xml как этот

<file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 

Результат является хуг-spring.profiles.active_IS_UNDEFINED.log

+0

Если PROFILE является свойством с ключом для активного профиля, он должен работать – davidxxx

+0

ПРОФИЛЬ, который я ищу, является свойством ** spring.profiles.active **, которое определено в application.yml или с помощью команды линия. – Leonel

ответ

8

Это немного поздно, чтобы ответить, но я успешно зарегистрировал профиль Spring, переименовав свой файл «logback.xml» в «logback-spring.xml» и получив доступ к профилю вроде этой (много) упрощенной версии

<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/> 

<appender name="GRAYLOG" class="com.github.pukkaone.gelf.logback.GelfAppender"> 

    <additionalField>environment=${ACTIVE_PROFILE}</additionalField> 

</appender> 

<root level="WARN"> 
    <appender-ref ref="GRAYLOG" /> 
</root> 

кажется, что "Logback-spring.xml" может забрать информацию о профиле.

Конкретные documentation is here.

3

Вот что я сделал для моего проекта. Внутри вашего logback.xml

<include resource="org/springframework/boot/logging/logback/defaults.xml"/> 

<property resource="application.properties"/> 

Затем вы можете использовать свойства, которые определены в файле application.properties. ${MY-PROPERTY} В моем приложении application.properties У меня есть свойство для имени файла журнала.

Это не работает с файлом свойств application.yml => YAML, потому что файл yaml интерпретируется после запуска журнала init.

+0

В моем проекте я использую свойства с application.yml (application-dev.yml и application-production.yml) ... так что у вас есть другой подход? – Leonel

+0

Ну нет, я пробовал, и кажется, ты не можешь. Возможно, вернитесь к файлу свойств, но будьте осторожны, если у вас есть специальные символы (файл свойств не подходит для utf-8) http://stackoverflow.com/questions/29669049/logback-xml-is-evaluated-before-application- yml-is –

2
  • Поскольку вы используете Spring Boot, вы можете определить logging.file=blah.log. См. official docs.
  • Или вы можете использовать ванильный журнал и передать системную переменную: -DLOG_FILE=blah.log.

Почему вы не должны использовать профили:

То, что вы пытаетесь сделать, это не то, что пружинные профили были созданы.Они необходимы для включения/выключения фасоли для активации/деактивации поведения во время запуска. Профили не рекомендуются в практике, так как то, что вы тестируете и что работает в производстве, отличается (хотя иногда другого выбора нет). См. Предостережения раздел the original announcement.

Другая проблема с использованием профилей заключается в том, что одновременно можно активировать несколько профилей. Были созданы профили для включения/выключения небольших несвязанных частей. Например. spring.profiles.active=cache-off,perf-monitoring-on или что-то в этом роде.

Имея все сказанное, вы все еще можете определить профиль и установить свойство logging.file=prod.log в этом профиле. Это все равно очень Плохо, а не как профили следует использовать, но это лучше.

+0

«Профили не рекомендуются в практике в целом, так как то, что вы тестируете и что работает в производстве, различно» В разделе «Предостережения» вы цитируете, что я ничего не читаю. Он говорит скорее: ** Набор бобов, зарегистрированных между двумя профилями, вероятно, должен быть более похожим на разные. ** И это я согласен. Как правило, веб-приложения должны перемещаться по нескольким средам (dev, интеграция и т. Д.) До производства), и каждый из них имеет специфику (ОС, URL-адрес, база данных и т. Д.), Игнорируя это, является плохой практикой. – davidxxx

+0

@davidhxxx URL-адреса, базы данных и т. Д. Не должны определяться в профилях. Они должны быть определены как системные vars, env vars, в JNDI или в файлах конфигурации приложения. Пожалуйста, также не принимайте только одну статью из статьи, она также говорит: _ Не используйте профили, если более простой подход может быть выполнен. –

+0

Я не беру всего одну часть из этой статьи. ** Не используйте профили, если более простой подход может выполнить работу ** не передает этот URL-адрес, информацию о базе данных и т. Д. ... не должен находиться в профиле. Кроме того, вы говорите, что эта информация может быть в конфигурационных файлах приложения. Но с помощью Spring boot профили также работают с файлом конфигурации приложения, который можно загрузить, когда сервер запускается или извлекается во время выполнения через аннотацию Property. Профили - это не только код Java. – davidxxx

Смежные вопросы