Logback tiene una función para escanear cambios en logback.xml (por this) - esto es un Gran característica que permite enviar aplicaciones de larga duración con INFO como nivel predeterminado para cambiar a DEPURAR cuando algo tiene que investigarse brevemente.

Pero en mi aplicación reciente (alojada en el clúster K8 de mi empresa como un contenedor Docker), no puedo usar la función anterior porque:

  • todavía no tengo la disposición para alojar volúmenes externos en los que puedo poner mi logback.xml (para que los desarrolladores lo cambien durante la depuración)
  • todavía no tiene la disposición de cambiar las variables de entorno en un contenedor en ejecución sin reiniciar
  • no tiene un servidor JNDI para asignar variables de registro

Teniendo en cuenta esto, ¿hay alguna manera de crear una disposición para que los desarrolladores cambien el nivel de registro de mi aplicación en tiempo de ejecución sin un reinicio de la aplicación / contenedor?

5
Bharadwaj 3 may. 2020 a las 00:24

2 respuestas

La mejor respuesta

Tengo un problema similar: necesito cambiar el nivel de registro de la aplicación en tiempo de ejecución sin reiniciar la aplicación de inicio de Spring. En mi situación, no estoy trabajando en un contexto acoplable, pero creo que la solución a nuestro problema es la misma.

Después de la investigación encontré 3 posibles soluciones:

  1. cambiar el archivo de registro en tiempo de ejecución
  2. habilite JMX y trabaje con JConsole para cambiar los niveles de registro
  3. use Spring Boot Admin.

La solución 3 es la mejor, si su aplicación es una aplicación Spring Boot. Puede leer el siguiente tutorial Cambiar el nivel de registro en tiempo de ejecución.

spring boot admin

Puede encontrar un ejemplo de cómo habilitar la interfaz de administración en Github.

0
xcesco 24 may. 2020 a las 09:10

No estoy seguro de si también está prohibido montar el mapa de configuración en un contenedor, ya que no lo ha mencionado.
Pero si no lo eres, puedes crear un mapa de configuración:

apiVersion: v1
kind: ConfigMap
metadata:
  name: logback-conf
data:
  logback.xml: |
    <configuration>
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>

Y agréguelo al contenedor de la siguiente manera:

  containers:
    - name: app
      volumeMounts:
      - name: config
        # The conf will be mounted at /app/logback.xml
        mountPath: /app
...
  volumes:
    - name: config
      configMap:
        name: logback-conf

Si ni siquiera se le permite inyectar un mapa de configuración (que hasta donde sé no causa tiempo de inactividad), realmente no hay mucho que pueda hacer

1
Nicolai Schmid 22 may. 2020 a las 21:05