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