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).
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:
- http://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html
- http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html
- http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer/LoggingApplicationContextInitializer.html
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.
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
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>
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.
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>
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.
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