Как ввести профиль active spring в logback

Я использую проект spring boot.

среда:

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

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

поскольку расширение пружины Logback начинается до весны, я не могу ввести пружину.профили.активен в 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>

профиль, который я ищу для свойства весна.профили.активный.

моя цель-иметь файл журнала в каталоге /var / log файлы xyz-dev или xyz-production но я получаю xyz-весна.профили.active_IS_UNDEFINED.log вместо конечно.

подходы:

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

@Component
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> {

// inject spring profile active into logback.xml

}

не работает, конечно, потому что расширение пружины logback начинается раньше Приложение Spring Boot.

2-Использование свойства в logback.xml, как это

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

результатом является XYZ-spring.профили.active_IS_UNDEFINED.log

3 ответов


немного поздно отвечать, но я успешно зарегистрировал профиль 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 " может забрать информацию о профиле.

конкретные документация здесь.


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

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

<property resource="application.properties"/>

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

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


  • поскольку вы используете Spring Boot, вы можете определить logging.file=blah.log. См.официальные документы.
  • или вы можете использовать vanilla Logback и передать системную переменную:-DLOG_FILE=blah.log.

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

то, что вы пытаетесь сделать, это не то, для чего были созданы профили spring. Они необходимы для включения/выключения компонентов для активации / деактивации поведения во время запуска. профили не рекомендуется практиковать в генерал!--18--> так как то, что вы тестируете и что работает в производстве, отличается (хотя иногда нет другого выбора). См.предостережения на исходное объявление.

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

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