Saltar al contenido

¿Cómo definir las variables / propiedades de logback antes de que logback se cargue automáticamente logback.xml?

Solución:

Definir una propiedad en logback.xml y cárguelo en el “contexto”:

<property scope="context" name="logfolder" value="${location.of.the.log.folder}" />

Luego defina su appender haciendo referencia a la propiedad:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${logfolder}/logfile.log</file>
    <append>true</append>
    <encoder>
        <pattern>[%d{ISO8601}] [%p] [%t] [%c] [%m]%n</pattern>
    </encoder>
</appender>

De la documentación:

Una propiedad con alcance de contexto se inserta en el contexto y dura tanto como el contexto o hasta que se borra. Una vez definida, una propiedad en el alcance del contexto es parte del contexto. Como tal, está disponible en todos los eventos de registro, incluidos los enviados a hosts remotos mediante serialización.

Por lo tanto, el alcance predeterminado, que es “local”, puede ser suficiente.

Después de rascarme un poco la cabeza, me estoy conformando con la siguiente solución.

Primero, coloque logback.xml fuera de classpath para que logback no cargue nada automáticamente.

En segundo lugar, agregue la configuración del entorno a las propiedades del sistema para que logback pueda buscarlas al analizar logback.xml.

En tercer lugar, configure el logback mediante programación en el código de la aplicación. (La documentación oficial de logback tiene un buen ejemplo de eso).

Hecho.

Quiero buscar el LOG_FILE propiedad del medio ambiente (o sistema operativo, por así decirlo)

Aquí están las alternativas:

  1. Si por medio ambiente, te refieres a lo que generalmente se conoce como variables de entorno, puedes hacer referencia a ellas directamente en el archivo de configuración sin mucha molestia.

  2. Si no se refiere a variables de entorno, sino a algo que requiere un código personalizado para acceder, puede implementar un ch.qos.logback.core.spi.PropertyDefiner personalizado que captura y devuelve el valor.

    p.ej

    public class MyCompanyEnvironmentGrabber extends PropertyDefinerBase {
    
        @Override
        public String getPropertyValue() {
            return ...; // grab the value from company environment
        }
    }
    
  3. Aparentemente, hay informes de que uno puede configurar programáticamente una variable antes logback.xml se carga poniéndolo antes de cualquier llamada a logger, y teniendo cuidado con el orden de carga de ClassLoader … Sin embargo, creo que esto es muy frágil como no usando static logger es muy difícil de controlar cuando la base del código se vuelve compleja.

En total, desde logback.xml se carga casi inmediatamente después de que se inicia la instancia de Java, las formas seguras de establecer dinámicamente el valor en una variable parecen limitarse a:

  1. Establecerlo fuera del programa Java, como a través de un script de shell de llamada, mediante el uso de variables de entorno o propiedades del sistema (-D).
  2. Devolviéndolo a través del ch.qos.logback.core.spi.PropertyDefiner llamar de vuelta.
  3. Configurándolo en un ch.qos.logback.classic.spi.LoggerContextListener como se hace en esta respuesta.
  4. Retrasar artificialmente la carga de logback.xml como lo ha hecho el OP en su respuesta.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *