sprężynowy bagażnik, logback i logowanie.właściwość config

Wdrażam logowanie w projekcie spring boot z biblioteką logback. Chcę wczytać Różne pliki konfiguracyjne logowania według moich profili spring (właściwość ' spring.pofiles.active"). Mam 3 pliki: logback-dev.xml, logback-inte.xml i logback-prod.xml. Używam spring boot w wersji 1.2.2.Uwolnij.

Jak można przeczytać w dokumentacji spring boot ( tutaj ). Pisze:

Różne systemy rejestrowania mogą być aktywowane przez włączenie odpowiednie biblioteki na ścieżce classpath, a następnie dostosowane przez dostarczenie odpowiedniego pliku konfiguracyjnego w katalogu głównym ścieżki classpath lub w lokalizacji określonej przez właściwość środowiska Spring logging.config . (Zauważ jednak, że ponieważ logowanie jest inicjowane przed utworzeniem ApplicationContext, nie można kontrolować logowania z @PropertySources w plikach Spring @Configuration. Właściwości systemu i konwencjonalne Spring Boot zewnętrzne pliki konfiguracyjne działają w porządku.)

Więc próbowałem ustawić ' logging.właściwość config ' w mojej aplikacji.Plik Właściwości:

logging.config=classpath:/logback-${spring.profiles.active}.xml

Ale kiedy uruchamiam aplikację, Mój logback-{profil}.xml nie jest ładowany...

Myślę, że logowanie jest częstym problemem, z którym zetknęły się wszystkie projekty korzystające z spring boot. Czy jestem na dobrej drodze z powyższym podejściem? Mam inne rozwiązania, które działają, ale uważam, że nie są tak eleganckie (warunkowe parsowanie z Janino w logbacku.plik xml lub wiersz poleceń nieruchomości).

Author: tonypdmtr, 2015-04-03

6 answers

Znalazłem rozwiązanie i zrozumiałem, dlaczego spring nie używa mojego logowania.właściwość config ' zdefiniowana w pliku application.properties.

Rozwiązanie i Wyjaśnienie:

Podczas inicjalizacji logowania, spring Boot szuka tylko w classpath lub zmiennych środowiskowych.

Rozwiązaniem, którego użyłem, było włączenie logbacka rodzica.plik xml zawierający właściwy plik konfiguracyjny logowania zgodnie z profilem spring.

Logback.xml:

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

Logback-[profil]xml (w tym przypadku logback-dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

Uwaga: 'wiosna.profile.aktywny ' musi być ustawiony w argumentach wiersza poleceń podczas uruchamiania aplikacji. Np. dla właściwości JVM: -Dspring.profiles.active=dev

Ref docs:

Edit (multiple active profiles) : Aby uniknąć wielu plików, możemy użyć przetwarzanie warunkowe, które wymaga zależności Janino (setup here ), zobacz dokumentacja warunkowa. Dzięki tej metodzie możemy również sprawdzić wiele aktywnych profili w tym samym czasie. Np. (nie testowałem tego rozwiązania, więc proszę o komentarz jeśli nie działa):

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

Zobacz javasenior answer dla innego przykładu przetwarzania warunkowego.

 74
Author: LG_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-06 17:25:03

Innym podejściem, które może obsługiwać wiele Profili, jest utworzenie osobnego pliku właściwości dla każdego środowiska.

Aplikacja-prod.właściwości

logging.config=classpath:logback-prod.xml

Application-dev.właściwości

logging.config=classpath:logback-dev.xml

Application-local.właściwości

logging.config=classpath:logback-local.xml

BE AWARE

Jeśli nie będziesz ostrożny, możesz skończyć logując się w nieoczekiwanym miejscu

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml
 32
Author: Zergleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 10:13:48

Zamiast dodawać oddzielne XMLS logback dla każdego profilu lub posiadające warunek IF, sugerowałbym następujące (Jeśli masz mniejszą różnicę w xmls') dla łatwego przetwarzania warunkowego:

<springProfile name="dev">
<logger name="org.sample" level="DEBUG" />
</springProfile>
<springProfile name="prod">
<logger name="org.sample" level="TRACE" />
</springProfile>
 8
Author: nav3916872,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 10:14:05

Spring ma wsparcie dla następnego tagu <springProperty/> wewnątrz pliku Logback XML, tag ten opisał tutaj . To znaczy, że można łatwo dodać zmienną z pliku właściwości Spring, nawet ta wartość zmiennej zostanie usunięta ze zmiennej środowiskowej/systemowej przez Spring.

 4
Author: Andriy Rymar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 13:27:32

Warunkowe przetwarzanie z logback będzie rozwiązaniem bez wielu plików logback. Oto link i przykładowa konfiguracja logbacka z profilami sprężynowymi.

<configuration>

    <property name="LOG_LEVEL" value="INFO"/>

        <if condition='"product".equals("${spring.profiles.active}")'>
           <then>
                <property name="LOG_LEVEL" value="INFO"/>
           </then>
           <else>
                <property name="LOG_LEVEL" value="ERROR"/>
           </else>
        </if>

         .
         .
         appender, logger tags etc.
         .
         .

         <root level="${LOG_LEVEL}">
             <appender-ref ref="STDOUT"/>
         </root>

</configuration>

Również, być może będziesz musiał dodać to do swojego pom.xml

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>
 4
Author: javasenior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 10:14:25

Możesz określić inny logback.xml dla innego profilu, tylko 3 kroki:

1, Podaj aktywny profil w application.properties lub application.yml:

spring.profiles.active: test

2, Config logback, aby uwzględnić różne konfiguracje według profilu:

<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds">
    <springProperty scope="context" name="profile" source="spring.profiles.active"/>
    <include resource="logback.${profile}.xml"/>
</configuration>

3, Utwórz plik konfiguracyjny logback.test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="INFO"/>
</included>

To bardzo proste, nie trzeba robić nic innego.

 2
Author: sulin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 09:58:52