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

Как изменить уровень журнала во время выполнения без перезапуска приложения загрузки spring

Я применил приложение springboot в PCF. Я хочу зарегистрировать сообщение на основе переменной окружения. Что я должен делать, чтобы изменение уровня журнала времени выполнения работало без перезапуска приложения?

4b9b3361

Ответ 1

Изменение уровня журнала в Spring Загрузка 1.5+ может быть выполнена с помощью http-endpoint

Добавить

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

и вы можете использовать

curl -X "POST" "http://localhost:8080/loggers/de.springbootbuch" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d $'{
  "configuredLevel": "WARN"
}'  

Где все за/логгерами/является именем регистратора.

Если вы запускаете это в PCF, он становится еще лучше: это напрямую поддерживается из их бэкэнда.

Ответ 3

Это расширение ответа @Michael Simons. С этим методом у вас будет пользовательский интерфейс для этого:

Этот метод немного дольше, но он решает гораздо больше. Мы собираемся использовать инструмент под названием Spring Boot Admin Server.

  1. Для начала необходимо включить некоторые зависимости

    <!--Dependency for registering your app as a Spring Boot Admin Server-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-server</artifactId>
        <version>1.3.3</version>
    </dependency>
    
    <!--Provide a nice looking ui-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-server-ui</artifactId>
        <version>1.3.3</version>
    </dependency>
    
    <!--Dependency for registering your app as a Spring Boot Admin Client-->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
            <groupId>org.jolokia</groupId>
            <artifactId>jolokia-core</artifactId>
    </dependency>
    
  2. Включите приложение в качестве сервера администрирования Spring Boot с помощью аннотации @EnableAdminServer.

    @SpringBootApplication
    @EnableAdminServer
    public class Application {
       public static void main(String[] args) {
          // ... your code as before ...
       }
    }
    
  3. В вашем application.properties добавьте следующее:

    Зарегистрируйте свое приложение на сервере администрирования Spring Boot, который все еще остается вашим приложением

    spring.boot.admin.url=http://localhost:8031
    

    Укажите Spring Boot Admin Server, где найти клиента

    // For versions 2.*.*
    spring.boot.admin.client.url=http://localhost:8031
    // For versions 1.*.*
    spring.boot.admin.client.service-url=http://localhost:8031
    spring.boot.admin.client.management-url=http://localhost:8031
    spring.boot.admin.client.health-url=http://localhost:8031/health
    
  4. В вашем logback.xml просто добавьте следующую строку <jmxConfigurator/>. Это позволяет сконфигурировать вход в систему через JMX. Больше информации здесь

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

я. Просто перейдите по ссылке на ваш сервер администрирования Spring Boot - в нашем случае здесь (http: /localhost:8031).

II. Список зарегистрированных приложений (клиентов) будет отображаться на главной странице.

III. Нажмите " Details для зарегистрированных клиентов, и вы попадете на другую страницу.

внутривенно Перейдите на вкладку " Logging ", в которой будут перечислены все регистраторы, зарегистрированные в вашем приложении.

v. Вы можете изменить уровни журнала, это изменит ваш уровень регистрации во время выполнения. Вот фрагмент того, что вы ожидаете

Change logging levels at runtime

Ответ 4

Если вы используете API logback для настройки регистрации в проекте, тогда вы можете использовать функцию AutoScan API logback. Согласно документации

logback-classic проверит изменения в своем файле конфигурации и автоматически перенастраивается при изменении файла конфигурации. Чтобы поручить logback-classic сканировать его изменения Конфигурационный файл и для автоматической самонастройки установите проверить атрибут элемента на true.

<configuration scan="true"> 
  ... 
</configuration> 

Частота сканирования: "By default, the configuration file will be scanned for changes once every minute". Подробнее см. в logback документации API.

Ответ 5

Для Spring Boot 2.1. 5+:

Во-первых, вам нужен подключаемый модуль привода:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Во-вторых, вам нужно предоставить конечную точку, как сказал Деннис в своем комментарии (по умолчанию loggers отключен):

management.endpoints.web.exposure.include=health,info,loggers

Наконец, вы можете использовать конечные точки отдыха, чтобы получить информацию о регистраторах и установить уровни ведения журнала.

curl -X "GET" "http://localhost:8080/actuator/loggers"

Чтобы установить уровень ведения журнала Root, вы можете использовать

curl -X "POST" "http://localhost:8080/actuator/loggers/ROOT" -H "Content-Type: application/json; charset=utf-8"   -d $'{ "configuredLevel": "INFO" }'

Ответ 6

Поставщик регистрации по умолчанию - это журнал. Чтобы настроить систему таким образом, чтобы уровень ведения журнала можно было изменить во время выполнения, вам необходимо выполнить следующие шаги:

Во-первых, в src/main/resources создайте настраиваемую конфигурацию журнала с именем logback-spring.xml, которая включает конфигуратор по умолчанию spring, а затем добавляет директиву, которая предоставляет конфигурацию журнала по JMX:

<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>
  <jmxConfigurator />    
</configuration>

Теперь добавьте зависимость от моста Jolokia JMX-over-HTTP: org.jolokia:jolokia-core.

Теперь вы можете удалять конечные точки /jolokia в своем загрузочном приложении spring. Протокол описан здесь. Это некрасиво. Чтобы начать работу, несколько примеров GET, которые вы можете использовать прямо из браузера:

Показывать уровень регистратора ROOT:

/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/getLoggerLevel/ROOT

Измените уровень регистратора ROOT для отладки:

/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/setLoggerLevel/ROOT/debug

spring -boot-actuator знает о конечной точке /jolokia, и он помечен как sensitive=true, поэтому, если у вас есть spring -security в пути к классам, тогда потребуется аутентификация.

Ответ 7

Вы можете создать конечную точку отдыха для обновления уровня журнала с помощью используемого вами журнала ведения журнала.

Это то же самое, что использует jhepester.

Ответ 8

Вы также можете добавить страницу настроек в веб-службу, чтобы обновить уровень журнала. Это можно сделать, используя ajax. Следующий пример включает логин и токен csrf:

Сначала добавьте некоторую форму, чтобы указать новый уровень журнала. Может быть улучшено, например, с помощью элемента select.

<form>
    <input type="text" id="logClassName" name="logClassName"/>
    <input type="text" id="logLevel" name="logLevel" />
    <button onclick="submitLogLevelChange(); return false;">Submit</button>
</form>

Затем запрос отправляется:

function submitLogLevelChange() {
    var className = document.getElementById('logClassName').value;
    var logLevel = document.getElementById("logLevel").value;
    $.ajax({
        // Set up security, see below.
        beforeSend: setHeader,
        type: 'POST',
        // specify the logger to be modified
        url: "/loggers/" + className,
        // specify the new log level
        data: '{"configuredLevel":"' + logLevel + '"}',
        contentType: 'application/json',
        processData: false,
        }).done(function(data, textStatus, jqXHR) {
            if (jqXHR.status === 200) {
                // Happy
            } else if (jqXHR.status === 401) {
                // Logged out or not enough user rights
            } else {
                //Some other problem
            }
        })
        .fail(function(jqXHR, textStatus ) {
            if (jqXHR.status === 200) {
                // Actually was successful, FireFox has some issues...
            } else {
                // Failure
            }
        });
    }

Следующая функция вводит токен csrf в запрос POST:

function setHeader(xhr) {
  var token = $("meta[name='_csrf']").attr("content");
  var header = $("meta[name='_csrf_header']").attr("content");
  xhr.setRequestHeader(header, token);
}

Ответ 9

Если вы используете Log4j 2 для ведения журнала, вы можете легко настроить его для установки уровня ведения журнала на основе переменной среды или системного свойства. Если вы сделаете это таким образом, вам не нужно будет изменять файл только потому, что изменилась среда.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" monitorInterval="300">
<properties>
  <property name="LOG_DIR">${sys:user.dir}/logs/</property>
  <property name="log_env">${sys:env:-lab}</property>
  <property name="flow_lab">${sys:flow_match:-ACCEPT}</property>
  <property name="flow_prod">NEUTRAL</property>
  <property name="level_lab">DEBUG</property>
  <property name="level_prod">INFO</property>
</properties>
<MarkerFilter marker="FLOW" onMatch="${flow_${log_env}}" onMismatch="NEUTRAL"/>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{ABSOLUTE} %-5level # %class.%method %m%n" />
    </Console>

    <RollingFile name="log4j" fileName="${LOG_DIR}/log4j.txt" filePattern="${LOG_DIR}/archive/log4j.txt.%d{yyyyMMdd_HHmmss}-%i">
        <PatternLayout>
            <MarkerPatternSelector defaultPattern="%d [%t] %-5p %X{requestId, sessionId, loginId, userId, ipAddress, corpAcctNumber} %C{1.}.%M:%L - %m%n">
                <PatternMatch key="FLOW" pattern="%d [%t] %-5p %X{requestId, sessionId, loginId, userId, ipAddress, corpAcctNumber} -------- %C{1.}.%M:%L %msg --------%n"/>
            </MarkerPatternSelector>
        </PatternLayout>
        <Policies>
            <SizeBasedTriggeringPolicy size="30 MB"/>
        </Policies>
        <!-- A max of 20 will allow 20 files per second with the date pattern specified on the RollingFile declaration.
             Hopefully that is a ridiculous value -->
        <DefaultRolloverStrategy min="1" max="20">
            <Delete basePath="${LOG_DIR}/archive">
                <!-- Nested conditions: the inner condition is only evaluated on files for which the outer conditions are true. -->
                <IfFileName glob="log4j.txt.*">
                    <!-- Only allow 1 GB of files to accumulate -->
                    <IfAccumulatedFileSize exceeds="1 GB"/>
                </IfFileName>
            </Delete>
        </DefaultRolloverStrategy>
    </RollingFile>
</Appenders>
<Loggers>
    <Logger name="com.mycorp.package1" level="${level_${log_env}}" additivity="false">
        <AppenderRef ref="log4j"/>
    </Logger>
    <Logger name="com.mycorp.package2" level="info" additivity="false">
        <AppenderRef ref="log4j"/>
    </Logger>
    <Root level="${level_${log_env}}">
        <AppenderRef ref="log4j" />
    </Root>
</Loggers>