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:
Vamos selecionarspring-boot-managemente visualizar os registradores usando o menu à esquerda:
O registradorcom.example.spring.boot.management.logging está definido como INFO. Vamos alterá-lo para TRACE e executar novamente nossa API de registro:
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.