Подтвердить что ты не робот

Установить уровень ведения журнала в Spring Загрузка через переменную среды

Можно ли установить уровни регистрации через переменные среды только в приложении Spring Boot?

Я не хочу использовать application.properties, поскольку я запускаюсь в Cloud Foundry и хочу получать изменения без развертывания (но после того, как приложение перезагрузилось или более точно описано).

Я пробовал устанавливать env vars как LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE, но это не имеет никакого эффекта. Ввод logging.level.org.springframework: TRACE в application.properties действительно работает.

4b9b3361

Ответ 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"}'

К сожалению, я не мог заставить это работать. Я, конечно, согласен с тем, что возможность перенастроить уровни ведения журнала на уровне пакета без изменения кода приложения будет удобной для работы.

Ответ 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 для каждого. Это неосуществимо. Таким образом, определения журналов в переменных среды не работают для классов, а только для пакетов.