Alterando o nível de log no tempo de execução de um aplicativo de inicialização Spring

Alterando o nível de log no tempo de execução de um aplicativo de inicialização Spring

1. Introdução

Neste tutorial, veremos maneiras de alterar o nível de registro de um aplicativo Spring Boot em tempo de execução. Como acontece com muitas coisas,Spring Boot has built-in logging functionality que configura para nós. Vamos explorar como ajustar os níveis de registro de um aplicativo em execução.

Veremos três maneiras de fazer isso: usando o endpoint dos registradoresSpring Boot Actuator, a funcionalidade de varredura automática emLogbacke, finalmente, usando a ferramentaSpring Boot Admin.

2. Atuador de inicialização por mola

Vamos começar usando o endpoint do atuador /loggers para exibir e alterar nosso nível de registro. The /loggers endpoint is available at actuator/loggers and we can access a specific logger by appending its name as part of the path.

Por exemplo, podemos acessar o logger root com a URLhttp://localhost:8080/actuator/loggers/root.

2.1. Configuração

Vamos começar configurando nosso aplicativo para usar o Spring Boot Actuator.

Primeiro, precisamos adicionarSpring Boot Actuator Maven dependency ao nosso arquivopom.xml:


    org.springframework.boot
    spring-boot-starter-actuator
    2.1.8.RELEASE

Starting with Spring Boot 2.x, most endpoints are disabled by default, então também precisaremos habilitar o endpoint /loggers em nosso arquivoapplication.properties:

management.endpoints.web.exposure.include=loggers
management.endpoint.loggers.enabled=true

Por último, vamos criar um controlador com uma série de instruções de registro para que possamos ver os efeitos de nossos experimentos:

@RestController
@RequestMapping("/log")
public class LoggingController {
    private Log log = LogFactory.getLog(LoggingController.class);

    @GetMapping
    public String log() {
        log.trace("This is a TRACE level message");
        log.debug("This is a DEBUG level message");
        log.info("This is an INFO level message");
        log.warn("This is a WARN level message");
        log.error("This is an ERROR level message");
        return "See the log for details";
    }
}

2.2. Usando o endpoint /loggers

Vamos iniciar nosso aplicativo e acessar nossa API de log:

curl http://localhost:8080/log

Então, vamos verificar os logs onde devemos encontrar três declarações de log:

2019-09-02 09:51:53.498  INFO 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController      : This is an INFO level message
2019-09-02 09:51:53.498  WARN 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController      : This is a WARN level message
2019-09-02 09:51:53.498 ERROR 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController      : This is an ERROR level message

Agora, vamos chamar o endpoint do atuador /loggers para verificar o nível de registro do nosso pacotecom.example.spring.boot.management.logging:

curl http://localhost:8080/actuator/loggers/com.example.spring.boot.management.logging
  {"configuredLevel":null,"effectiveLevel":"INFO"}

Para alterar o nível de registro, podemos emitir uma solicitaçãoPOST para o endpoint /loggers:

curl -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel": "TRACE"}'
  http://localhost:8080/actuator/loggers/com.example.spring.boot.management.logging
  HTTP/1.1 204
  Date: Mon, 02 Sep 2019 13:56:52 GMT

Se verificarmos o nível de registro novamente, devemos vê-lo definido comoTRACE:

curl http://localhost:8080/actuator/loggers/com.example.spring.boot.management.logging
  {"configuredLevel":"TRACE","effectiveLevel":"TRACE"}

Por fim, podemos executar novamente nossa API de log e ver nossas alterações em ação:

curl http://localhost:8080/log

Agora, vamos verificar os registros novamente:

2019-09-02 09:59:20.283 TRACE 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is a TRACE level message
2019-09-02 09:59:20.283 DEBUG 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is a DEBUG level message
2019-09-02 09:59:20.283  INFO 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is an INFO level message
2019-09-02 09:59:20.283  WARN 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is a WARN level message
2019-09-02 09:59:20.283 ERROR 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is an ERROR level message

3. Verificação automática de logback

By default, our Spring Boot applications are using the Logback logging library. Agora vamos ver como podemos tirar proveito do recurso de verificação automática do Logback para alterar nosso nível de registro.

Primeiro, vamos adicionar algumas configurações de Logback colocando um arquivo chamadologback.xml em nosso diretóriosrc/main/resources:


    
        
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        
    

    

    
        
    

O detalhe chave está na primeira linha do arquivologback.xml. By setting the scan attribute to true, we’re telling Logback to check the configuration file for changes. The auto-scan happens every 60 seconds by default.

DefinirscanPeriod para 15 segundos indica que ele deve ser recarregado a cada 15 segundos, para que não tenhamos que esperar tanto tempo durante nossos experimentos.

Vamos tentar iniciar o aplicativo e chamar nossa API de log novamente:

curl http://localhost:8080/log

Nossa saída deve refletir o nível de registroINFO para nosso pacote:

10:21:13.167 [http-nio-8080-exec-1] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:21:13.167 [http-nio-8080-exec-1] WARN  c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:21:13.168 [http-nio-8080-exec-1] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

Agora, vamos modificar nosso registradorcom.example.spring.boot.management.logging emlogback.xml paraTRACE:

Após 15 segundos, vamos executar novamente a API de log emhttp://localhost:8080/loge verificar nossa saída de log:

10:24:18.429 [http-nio-8080-exec-2] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:24:18.430 [http-nio-8080-exec-2] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:24:18.430 [http-nio-8080-exec-2] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:24:18.430 [http-nio-8080-exec-2] WARN  c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:24:18.430 [http-nio-8080-exec-2] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

4. Spring Boot Admin

A terceira maneira de alterar nosso nível de registro é por meio da ferramenta Spring Boot Admin. To use the Spring Boot Admin, we need to create a server application and configure our application as a client.

4.1. O aplicativo Admin

Para alterar nosso nível de registro com Spring Boot Admin, precisaremos configurar um novo aplicativo para usar como nosso servidor de administração. Podemos usarSpring Initialzr para isso.

Vamos adicionar o últimospring-boot-admin-starter-server ao nosso pom.xml:


    de.codecentric
    spring-boot-admin-starter-server
    2.1.6

Para obter instruções detalhadas sobre como configurar um Servidor Admin, consulte a Seção 2 em nossoGuide to Spring Boot Admin. Além disso, a Seção 4 inclui as informações necessárias para configurar a segurança, já que protegeremos nosso cliente.

4.2. Configuração do Cliente

Depois de termos um servidor de administração, precisamos configurar nosso aplicativo como cliente.

Primeiro, vamos adicionar uma dependência Maven paraspring-boot-admin-starter-client:


    de.codecentric
    spring-boot-admin-starter-client
    2.1.6

Também queremos segurança entre nosso servidor de administração e o cliente, então vamos trazer oSpring Boot Security starter:


    org.springframework.boot
    spring-boot-starter-security
    2.1.8.RELEASE

Em seguida, precisamos fazer algumas alterações de configuração em nossos arquivosapplication.properties.

O servidor admin está sendo executado na porta 8080, então vamos começar mudando nossa porta e dando um nome ao aplicativo:

spring.application.name=spring-boot-management
server.port=8081

Agora, vamos adicionar a configuração de que precisamos para acessar o servidor:

spring.security.user.name=client
spring.security.user.password=client

spring.boot.admin.client.url=http://localhost:8080
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=admin

spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

Isso inclui a URL na qual o servidor administrador está sendo executado e as informações de login do cliente e do servidor administrativo.

Por último, precisamos habilitar os pontos de extremidade do atuador /health, /infoe/metrics para que o servidor administrativo seja capaz de determinar o status do cliente:

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

Como a alteração dos níveis do criador de logs é uma operação POST, também precisamos adicionar um pouco de configuração de segurança para ignorar a proteção CSRF para os pontos de extremidade do atuador:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().ignoringAntMatchers("/actuator/**");
}

4.3. Usando o Spring Boot Admin

Com a configuração fora do caminho, vamos iniciar o aplicativo cliente e servidor usandomvn spring-boot:run.

Vamos começar acessando nossa API de log emhttp://localhost:8081/log sem alterar nada. Temos a segurança ativada agora, então seremos solicitados a fazer login usando as credenciais que especificamos emapplication.properties.

Nossa saída de log deve mostrar mensagens de log que refletem nosso nível de log INFO:

09:13:23.416 [http-nio-8081-exec-10] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
09:13:23.416 [http-nio-8081-exec-10] WARN  c.b.s.b.m.logging.LoggingController - This is a WARN level message
09:13:23.416 [http-nio-8081-exec-10] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

Agora, vamos fazer login no servidor Spring Boot Admin e mudar nosso nível de registro. Vamos parahttp://localhost:8080 e faça login com as credenciais de administrador. Seremos levados para a lista de aplicativos registrados, onde devemos ver nosso aplicativospring-boot-management:

image

Vamos selecionarspring-boot-managemente visualizar os registradores usando o menu à esquerda:

image

O registradorcom.example.spring.boot.management.logging está definido como INFO. Vamos alterá-lo para TRACE e executar novamente nossa API de registro:

image

Nossa saída de log agora deve refletir o novo nível do criador de logs:

10:13:56.376 [http-nio-8081-exec-4] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:13:56.376 [http-nio-8081-exec-4] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:13:56.376 [http-nio-8081-exec-4] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:13:56.376 [http-nio-8081-exec-4] WARN  c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:13:56.376 [http-nio-8081-exec-4] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

5. Conclusão

Neste artigo, exploramos diferentes maneiras de controlar o nível de log em tempo de execução. Começamos usando a funcionalidade de atuadores internos. Depois disso, usamos o recurso de verificação automática do Logback.

Por fim, aprendemos como usar o Spring Boot Admin para monitorar e alterar os níveis de log em um aplicativo cliente registrado.

O código de exemplo parausing actuators and Logbacke para configurarSpring Boot Admin estão disponíveis no GitHub.