springframework org mkyong logger debug java spring logging spring-boot pcf

java - org - spring boot logging mkyong



¿Cómo cambio el nivel de registro en el tiempo de ejecución sin reiniciar la aplicación de arranque de primavera? (7)

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

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


El cambio del nivel de registro en Spring Boot 1.5+ se puede hacer con un punto final de http

Añadir

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

y 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 se admite directamente desde su backend.


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

Primero, en src/main/resources cree una configuración personalizada de registro de retorno llamada logback-spring.xml que incluya el configurador predeterminado de Spring y luego agregue la directiva que expone la configuración de registro de retorno a través de JMX:

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

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

Ahora debería poder alcanzar /jolokia puntos finales /jolokia en su aplicación de arranque de primavera. El protocolo está documentado aquí . No es lindo. Para comenzar, aquí hay algunos ejemplos de GET que puedes golpear directamente desde un navegador:

Mostrar nivel de 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 del punto final /jolokia y tiene una marca sensitive=true por lo que si tiene seguridad de resorte en la ruta de clase, será necesario su autenticación.


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

Este método es un poco más largo pero resuelve mucho más . Vamos a utilizar una herramienta llamada Spring Boot Admin Server .

  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 de arranque mediante el uso de la anotación @EnableAdminServer .

    @SpringBootApplication @EnableAdminServer public class Application { public static void main(String[] args) { // ... your code as before ... } }

  3. En su application.properties agregue lo siguiente:

    Registre su aplicación en Spring Boot Admin Server, que sigue siendo su aplicación

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

    Indique a Spring Boot Admin Server 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 su logback.xml simplemente agregue la siguiente línea <jmxConfigurator/> . Esto permite la configuración de logback a través de JMX. Más información here

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

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

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

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

iv. Haga clic en la pestaña Logging que mostrará una lista de todos los registradores registrados en su aplicación.

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


Si está utilizando la API de logback de sesión para configurar el registro en el proyecto, puede utilizar la función AutoScan de la API de logback de logback . Según la documentación

logback-classic buscará los cambios en su archivo de configuración y se reconfigurará automáticamente cuando cambie el archivo de configuración. Con el fin de instruir a logback-classic para que busque cambios en su archivo de configuración y para que se vuelva a configurar automáticamente, establezca el atributo de exploración del elemento en verdadero.

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

Consulte la documentación de la API de logback para obtener más detalles.


Si usa Log4j 2 para el registro, puede configurarlo fácilmente para configurar el nivel de registro para usar en función de una variable de entorno o propiedad del sistema. Si lo haces de esta manera, no necesitarás modificar el archivo solo porque el entorno haya cambiado.

<?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>


También puede agregar una página de configuración en el servicio web para actualizar el nivel de registro. Esto se puede hacer entonces usando ajax. El siguiente ejemplo incluye el inicio de sesión y el token csrf:

Primero, agregue alguna forma para especificar el nuevo nivel de registro. Se puede mejorar, por ejemplo, mediante el uso de un elemento de select .

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

A continuación, se envía la solicitud:

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 } }); }

La siguiente función inyecta el token csrf a la solicitud POST:

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