2016-09-17 37 views
6

Używam projektu wiosennego rozruchu.Jak wstrzykiwać aktywny profil sprężyny w logback

Środowisko:

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 

W moim projekcie używam właściwości z application.yml (application-dev.yml i aplikacji production.yml)

Od Logback wiosennym rozszerzenia rozpoczyna się przed wiosną Nie mogę wstrzyknąć pliku spring.profiles.active do pliku logback.xml.

Jest to prostsza wersja mojego pliku 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> 

profilu szukam jest własnością spring.profiles.active.

Moim celem jest, aby mieć plik dziennika w katalogu /var/log te pliki xyz-dev lub xyz-produkcja ale coraz xyz-spring.profiles.active_IS_UNDEFINED.log zamiast kursu .

podejść:

1 - za pomocą komponentu jak:

@Component 
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> { 

// inject spring profile active into logback.xml 

} 

nie działa oczywiście ponieważ rozszerzenie logback Wiosna rozpoczyna się przed nałożeniem Wiosna Boot.

2 - Korzystanie z nieruchomości na logback.xml jak ten

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

wynik jest xyz-spring.profiles.active_IS_UNDEFINED.log

+0

jeśli PROFIL jest własnością z kluczem wartości dla aktywnego profilu, powinien działać – davidxxx

+0

PROFIL, którego szukam, jest właściwością ** spring.profiles.active **, która jest zdefiniowana w application.yml lub poleceniem linia. – Leonel

Odpowiedz

8

Trochę za późno na odpowiedź, ale pomyślnie zarejestrowałem profil wiosenny, zmieniając nazwę pliku "logback.xml" na "logback-spring.xml", i uzyskałem dostęp do profilu w ten sposób (znacznie) w uproszczonej wersji

<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> 

wydaje się, że "logback-spring.xml" może odebrać informacje o profilu.

Specyficzne documentation is here.

3

Oto co zrobiłem dla mojego projektu. Wewnątrz logback.xml

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

<property resource="application.properties"/> 

Następnie można użyć właściwości, które są zdefiniowane w pliku application.properties. ${MY-PROPERTY} W mojej aplikacji.properties Mam właściwość dla nazwy pliku logu.

To nie działa z plikiem właściwości application.yml => YAML, ponieważ plik yaml jest interpretowany po zainicjowaniu logback.

+0

W moim projekcie używam właściwości z application.yml (application-dev.yml i application-production.yml) ... więc czy masz inne podejście? – Leonel

+0

No nie, próbowałem i wygląda na to, że nie możesz. Może przełączyć się z powrotem do pliku właściwości, ale uważaj, jeśli masz specjalne znaki (plik właściwości nie jest przyjazny dla utf-8) http://stackoverflow.com/questions/29669049/logback-xml-jest-oceniony- przed rozpoczęciem- yml-is –

2
  • Ponieważ używasz Spring Boot, możesz zdefiniować logging.file=blah.log. Zobacz official docs.
  • Możesz też użyć logiki wanilii i przekazać zmienną systemową: -DLOG_FILE=blah.log.

Dlaczego nie należy używać profili:

Co starasz się zrobić to, co nie zostało stworzone profile sprężynowe dla.Są one potrzebne do włączania/wyłączania fasoli, aby aktywować/dezaktywować zachowanie podczas uruchamiania. Profile nie są ogólnie zalecane w praktyce, ponieważ to, co testujesz i co działa w produkcji, jest inne (choć czasami nie ma innego wyboru). Zobacz Ostrzeżenia sekcja the original announcement.

Innym problemem związanym z używaniem profili jest to, że wiele profili można aktywować w tym samym czasie. Profile zostały utworzone w celu włączania/wyłączania małych niezwiązanych części. Na przykład. spring.profiles.active=cache-off,perf-monitoring-on lub coś w tym rodzaju.

Mając to wszystko, można nadal zdefiniować profil i ustawić właściwość logging.file=prod.log w tym profilu. To nadal jest złe, a nie jak powinny być używane profile, ale to jest lepsze.

+0

"Profiles nie jest ogólnie zalecaną praktyką, ponieważ to, co testujesz i co działa w produkcji, jest inne" W dziale "Ostrzeżenia", cytuję, nie czytam niczego w ten sposób. Mówi raczej: ** Zbiór fasoli zarejestrowany między dwoma profilami powinien prawdopodobnie być bardziej podobny niż inny. ** I z czym się zgadzam. Zasadniczo aplikacje internetowe muszą poruszać się w wielu środowiskach (deweloper, integracja, itp.) Aż do produkcji), a każdy z nich ma specyficzne cechy (system operacyjny, adres URL, baza danych itp.), Ignorując, że jest to zła praktyka. – davidxxx

+0

@davidhxxx Adresy URL, bazy danych itp. Nie powinny być definiowane w profilach. Trzeba je zdefiniować jako vars systemu, env vars, w JNDI lub w plikach konfiguracyjnych specyficznych dla aplikacji. Proszę również nie wyjmować z artykułu tylko jednego fragmentu, mówi również: _Nie używaj profili, jeśli prostsze podejście może wykonać zadanie. –

+0

Nie biorę tylko jednego fragmentu z artykułu. ** Nie używaj profili, jeśli prostsze podejście może wykonać zadanie ** nie przekazuje, że adres URL, informacje o bazie danych itp. ... nie powinny znajdować się w profilu. Poza tym mówisz, że te informacje mogą znajdować się w plikach konfiguracyjnych specyficznych dla aplikacji. Ale z rozruchu Spring, profile działa również z pliku konfiguracyjnego specyficzne dla aplikacji niż można załadować, gdy serwer jest uruchamiany lub pobierany w czasie wykonywania za pomocą adnotacji właściwości. Profile to nie tylko kod Java. – davidxxx