Установить уровень ведения журнала в Spring Загрузка через переменную среды
Можно ли установить уровни регистрации через переменные среды только в приложении Spring Boot?
Я не хочу использовать application.properties
, поскольку я запускаюсь в Cloud Foundry и хочу получать изменения без развертывания (но после того, как приложение перезагрузилось или более точно описано).
Я пробовал устанавливать env vars как LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE
, но это не имеет никакого эффекта. Ввод logging.level.org.springframework: TRACE
в application.properties
действительно работает.
Ответы
Ответ 1
Это просто идея, но вы пытались установить
_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE
?
Теоретически этот способ -Dlogging.level.org.springframework=TRACE
будет передан как аргумент JVM по умолчанию и должен влиять на каждый экземпляр JVM в вашей среде.
Ответ 2
Я также попытался установить уровень ведения журнала через переменную среды, но, как уже упоминалось, это невозможно, используя переменную среды с именем верхнего регистра, например. LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG
. Я также не хотел делать это через application.properties
или _JAVA_OPTIONS
.
После перехода в класс org.springframework.boot.logging.LoggingApplicationListener
я проверил, что boot spring пытается установить уровень ведения журнала DEBUG
в ORG_SPRINGFRAMEWORK
, который не является реальным именем пакета. Таким образом, вывод заключается в том, что вы можете использовать переменную среды для установки уровня ведения журнала, но она должна быть в форме:
LOGGING_LEVEL_org.springframework=DEBUG
или
logging.level.org.springframework=DEBUG
Протестировано на spring загрузке 1.5.3
Ответ 3
Да, вы можете контролировать уровень ведения журнала с помощью переменной окружения. Вот как я реализовал для моего приложения Spring Boot, развернутого на платформе Cloud Foundry.
В файле конфигурации журнала укажите местозаполнитель для уровня ведения журнала для чтения значения из переменной среды. Значение по умолчанию - INFO.
<logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}">
<appender-ref ref="CONSOLE"/>
</logger>
И затем в файле манифеста развертывания CF укажите переменную среды.
applications:
- name: my-app-name
memory: 2048
env:
APP_LOGGING_LEVEL: DEBUG
Надеюсь, это поможет.
Ответ 4
Я бы все же предложил вам использовать профили Spring:
-
Создайте 2 файла свойств:
application-local.properties
и
application-remote.properties
(имена профилей могут быть разными)
-
Установите уровень ведения журнала в каждом файле соответственно (logging.level.org.springframework
)
-
Запустите приложение с -Dspring.profiles.active=local
локально и -Dspring.profiles.active=remote
для CF.
Ответ 5
Также используя Spring Boot (v1.2.3) в Cloud Foundry, я обнаружил, что можно настроить уровень ведения журнала root с помощью переменной среды следующим образом:
$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG
К сожалению, не представляется возможным набрать уровень ведения журнала для определенных пакетов (по крайней мере, с версией Java Buildpack и Spring Boot, которую я использую). Например, добавление следующего в дополнение к вышеизложенному не снижает уровень журнала для рамки Spring:
$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO
Если вы используете что-то вроде Splunk для сбора ваших журналов, вы можете отфильтровать шум, однако.
Другая альтернатива, которая выглядит многообещающей, может быть основана на настройке параметра аргументов build pack (см. здесь):
$ cf set-env <app name> '{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}'
К сожалению, я не мог заставить это работать. Я, конечно, согласен с тем, что возможность перенастроить уровни ведения журнала на уровне пакета без изменения кода приложения будет удобной для работы.
Ответ 6
В spring-boot 2.0.0 добавление --trace
работает. Например, java -jar myapp.jar --debug
или java -jar myapp.jar --trace
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html#boot-features-logging-console-output
Ответ 7
Начиная с Spring Boot 2.0.x это снова работает. Протестировано с Spring Boot v2.0.9.RELEASE. Например, включить журнал отладки пула соединений:
LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
или журнал отладки Spring Framework:
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG java -jar myApp.jar
или оба:
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
См. Документацию Spring Boot "Приложение A. Общие свойства приложения" для получения дополнительных свойств приложения.
Ответ 8
Вот пример использования Logback с Janino условно включать различные конфигурации протоколирования через свойства или переменные окружения... Базовая конфигурация, logback.xml использует условные обозначения для ведения журнала разработки или создание файлов... просто отбросьте следующие файлы в /resources/
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<if condition='property("spring.profiles.active").contains("dev")'>
<then>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<include resource="dev.xml" optional="true"/>
</then>
</if>
<if condition='property("spring.profiles.active").contains("pro")'>
<then>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<include resource="pro.xml" optional="true"/>
</then>
</if>
</configuration>
dev.xml
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>utf-8</charset>
<Pattern>%-30([%p] [%c:%L]) » %m%n%rEx</Pattern>
</encoder>
</appender>
<!-- CHATTY LOGGERS HERE.-->
<logger name="org.springframework" level="DEBUG"/>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<root level="${logback.loglevel}">
<appender-ref ref="CONSOLE"/>
</root>
</included>
pro.xml
<included>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/>
<property name="FILE_NAME_PATTERN" value="./logs/%d{yyyy-MM-dd}-exec.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>FILE_NAME_PATTERN</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!-- APP SPECIFIC LOGGERS HERE.-->
<logger name="org.springframework.boot.SpringApplication" level="INFO"/>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</included>
Ответ 9
Люди могут объяснить, почему это не работает?
$export LOGGING_LEVEL_COM_ACME = ERROR
Для любой другой конфигурации с использованием переменных окружения в качестве переопределения, похоже, нет проблем, например:
$export EUREKA_CLIENT_ENABLED = false
Спасибо.
Ответ 10
Настройка уровней журнала с помощью переменных среды может быть выполнена только для пакетов, но не для классов
У меня была та же проблема, что и у ОП. И мне было интересно, почему некоторые пользователи здесь сообщили, что предложенные решения работали хорошо, а другие ответили, что нет.
Я нахожусь на Spring Boot 2.1, и проблема, очевидно, немного изменилась за последние годы, но текущая ситуация выглядит следующим образом:
TL; DR
Установка уровня журнала для пакета работает:
LOGGING_LEVEL_COM_ACME_PACKAGE=DEBUG
Хотя настройка уровня журнала для определенного класса не имеет никакого эффекта:
LOGGING_LEVEL_COM_ACME_PACKAGE_CLASS=DEBUG
Как это может быть?
Взгляните на Spring Boot LoggingApplicationListener.
Если вы отладите его и установите точку останова в выделенном блоке кода, вы увидите, что определение уровня журнала для класса com.acme.mypackage.MyClass
становится
com.acme.mypackage.myclass
.
Таким образом, определение уровня журнала для класса выглядит точно так же, как определение журнала для пакета.
Это связано с Spring Relaxed Binding, который предлагает прописные нотации для переменных среды. Таким образом, типичная запись случая верблюда для класса недоступна для LoggingApplicationListener. С другой стороны, я думаю, что нельзя проверить, соответствует ли данный полный путь классу. Можно было бы сгенерировать все возможные обозначения падежа верблюда для имени класса и запросить ClassLoader для каждого. Это неосуществимо. Таким образом, определения журналов в переменных среды не работают для классов, а только для пакетов.