¿Cómo cambio el nivel de registro en tiempo de ejecución sin reiniciar la aplicación Spring Boot?

7 minutos de lectura

Avatar de usuario de Samir Padhy
Samir Padhy

He implementado la aplicación springboot en PCF. Quiero registrar el mensaje en función de la variable de entorno. ¿Qué debo hacer para que el cambio del nivel de registro del tiempo de ejecución funcione sin reiniciar la aplicación?

Se puede cambiar el nivel de registro en Spring Boot 1.5+ con un punto final http

Agregar

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

y de lo que puedes usar

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

Donde todo más allá de /loggers/ es el nombre del registrador.

Si ejecuta esto en PCF, es aún mejor: esto es compatible directamente desde su backend.

  • Vale la pena enfatizar que el punto final de los registradores de Actuator se agregó en 1.5.1 y si tiene una aplicación Spring Boot más antigua que usa

    –Kevin Hooke

    10 de febrero de 2018 a las 1:57

  • Para Spring Boot 2.1, debe asegurarse de que el punto final de los registradores esté expuesto a la web agregando el valor de los registradores a la configuración management.endpoints.web.exposure.include. Si no tiene esa línea en su application.properties archivo, que agregar: management.endpoints.web.exposure.include=health,info,loggersya que su valor predeterminado es salud, información

    -Dennis

    27 de noviembre de 2018 a las 16:25


  • En este artículo se describe el proceso: blog.codeleak.pl/2017/03/… . No olvide agregar el atributo scan=true en logback.xml como está escrito aquí: stackoverflow.com/a/42575844/379173

    – Enrico Giurin

    15 de enero de 2019 a las 18:32

Avatar de usuario de Alexander Weiß
Alexander Weiß

Para Spring Boot 2.1.5+:

Primero, necesita el complemento del actuador:

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

En segundo lugar, debe exponer el punto final como dijo Dennis en su comentario (loggers está deshabilitado por defecto):

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

Finalmente, puede usar los puntos finales de descanso para obtener información sobre los registradores y establecer los niveles de registro.

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

Para configurar el Root Nivel de registro que puede usar

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

  • ¡Gracias! los management.endpoints.web.exposure.include=...,loggers propiedad era la pieza que faltaba!

    – t0r0X

    9 de agosto de 2019 a las 13:21

Avatar de usuario de Kihats
Kihats

Esta es una extensión de la respuesta de @Michael Simons. Con este método, tendrá una interfaz de usuario para hacerlo:

Este método es un poco más largo pero resuelve mucho mucho mas. Vamos a utilizar una herramienta llamada Servidor de administración Spring Boot.

  1. Primero necesitas incluir algunas dependencias

    <!--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. Habilite su aplicación para que sea un servidor de administración Spring Boot usando la anotación @EnableAdminServer.

    @SpringBootApplication
    @EnableAdminServer
    public class Application {
       public static void main(String[] args) {
          // ... your code as before ...
       }
    }
    
  3. En tus application.properties agrega lo siguiente:

    Registre su aplicación en el servidor de administración de Spring Boot, que sigue siendo su aplicación

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

    Indique al servidor de administración de Spring Boot dónde encontrar el cliente

    // 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. En tus logback.xml solo agrega la siguiente linea <jmxConfigurator/>. Esto permite la configuración del inicio de sesión a través de JMX. Más información aquí

… y listo estás listo. Ahora puede cambiar el nivel de depuración de cualquier registrador en tiempo de ejecución.

i. Simplemente visite la URL de su servidor de administración de Spring Boot; en nuestro caso, aquí (http:/localhost:8031).

ii. En la página de inicio se mostrará una lista de las aplicaciones (clientes) registradas.

iii. Hacer clic Details contra los clientes registrados que lo llevará a otra página.

IV. Haga clic en el Logging pestaña que enumerará todos los registradores registrados en su aplicación.

v. Puede cambiar los niveles de registro; cambiará su nivel de registro en tiempo de ejecución. Aquí tienes un fragmento de lo que esperas

Cambiar los niveles de registro en tiempo de ejecución

Avatar de usuario de Sai Prateek
sai prateek

Si estás usando logback api para configurar el inicio de sesión en el proyecto, entonces puede usar el Auto escáner característica de logback API. Según la documentación

logback-classic buscará cambios en su archivo de configuración y se reconfigurará automáticamente cuando cambie el archivo de configuración. Para instruir a logback-classic para buscar cambios en su archivo de configuración y reconfigurarse automáticamente, establezca el atributo de escaneo del elemento en verdadero.

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

Frecuencia de escaneo: “By default, the configuration file will be scanned for changes once every minute“. Ver el logback documentación de la API para más detalles.

Desde Spring Boot 1.5.x, puede usar el punto final del registrador para enviar el nivel de registro deseado.

Avatar de usuario de Andy Brown
andy marrón

El proveedor de registro predeterminado es logback. Para configurar su sistema de modo que el nivel de registro se pueda cambiar en tiempo de ejecución, debe realizar los siguientes pasos:

primero en src/main/resources crear una configuración de inicio de sesión personalizada llamada logback-spring.xml que incluye el configurador predeterminado de Spring y luego agrega la directiva que expone la configuración de inicio de sesión sobre JMX:

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

Ahora agregue una dependencia en el puente Jolokia JMX-over-HTTP: org.jolokia:jolokia-core.

Ahora debería poder golpear /jolokia puntos finales en su aplicación Spring Boot. el protocolo es documentado aquí. No es lindo. Para empezar, aquí hay algunos GET ejemplos que puede acceder directamente desde un navegador:

Mostrar el nivel del registrador ROOT:

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

Cambie el nivel del registrador ROOT para depurar:

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

spring-boot-actuator es consciente de la /jolokia punto final y está marcado sensitive=true por lo tanto, si tiene Spring-Security en el classpath, requerirá autenticación.

Puede usar el siguiente código en el controlador y llamar a la API para cambiar el nivel de registro

@PostMapping("/changeloglevel")
public void changeloglevel(@RequestParam String loglevel)
{
    LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
    loggerContext.getLogger("package where springboot main class resides").setLevel(Level.toLevel(loglevel));   
}

El nivel de registro puede ser ERROR, INFO, WARN, etc.

  • java.lang.ClassCastException: la clase org.apache.logging.slf4j.Log4jLoggerFactory no se puede convertir a la clase org.apache.logging.log4j.core.LoggerContext

    – Peterson V.

    15 de agosto de 2020 a las 14:06

  • @PetersonV, revise sus importaciones y asegúrese de usar las clases de inicio de sesión correctas, no las clases log4j u otras

    – ahmednabil88

    21 de septiembre a las 23:11

  • más si necesita establecer el nivel de registro globalmente para todas las clases [for root]puedes por loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.valueOf(loglevel));

    – ahmednabil88

    21 de septiembre a las 23:12

¿Ha sido útil esta solución?