java - example - logback spring boot
¿Cómo definir variables/propiedades de logback antes de logback auto-load logback.xml? (3)
Mi empresa tiene una herramienta de administración del entorno que le permite buscar propiedades del entorno mediante programación en Java. Quiero aprovechar esta herramienta para configurar el inicio de sesión. Por ejemplo, supongamos que tengo un logback.xml de la siguiente manera (en particular, la sección del archivo adjunto):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- console appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
</encoder>
</appender>
<!-- file appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_FILE:-/default/log/file/path</file>
<encoder>
<pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
Entonces, en este caso, quiero buscar la propiedad LOG_FILE
en el entorno (o sistema operativo, si lo desea), y pasarla a logback antes de que logback cargue logback.xml para que sepa el valor de LOG_FILE
. Entonces, ¿cómo puedo lograr eso? Por cierto, sé cómo definir un apéndice de archivos mediante programación, pero eso no es lo que quiero aquí.
Muchas gracias.
Quiero buscar la propiedad
LOG_FILE
desde el entorno (o sistema operativo, si lo desea)
Aquí están las alternativas:
Si por entorno te refieres a lo que generalmente se conoce como variables de entorno , puedes consultarlas directamente en el archivo de configuración sin mucho problema.
Si no quiere decir variables de entorno, sino algo que requiere un código personalizado para acceder, puede implementar un ch.qos.logback.core.spi.PropertyDefiner personalizado que capture y devuelva el valor.
p.ej
public class MyCompanyEnvironmentGrabber extends PropertyDefinerBase { @Override public String getPropertyValue() { return ...; // grab the value from company environment } }
apparently informes de que uno puede configurar una variable
logback.xml
antes de que se carguelogback.xml
colocándola antes de cualquier llamada allogger
, y teniendo cuidado del orden de carga de ClassLoader ... Sin embargo, creo que esto es muy frágil ya que no usarstatic logger
muy difícil de controlar cuando el código base se vuelve complejo.
logback.xml
todo esto, dado que logback.xml
se carga casi inmediatamente después de que se inicie la instancia de Java, las formas seguras de establecer dinámicamente el valor para una variable parecen limitarse a:
- Configurándolo 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
). - Devolviéndolo a través de la
ch.qos.logback.core.spi.PropertyDefiner
llamadach.qos.logback.core.spi.PropertyDefiner
. - Configurándolo en un
ch.qos.logback.classic.spi.LoggerContextListener
como se hace en esta respuesta . -
logback.xml
artificialmente la carga delogback.xml
como lo ha hecho el OP en su respuesta .
Defina una propiedad y cárguela utilizando el contexto:
<property scope="context" name="logfolder" value="${location.of.the.log.folder}" />
A continuación, 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>
Después de rascarme un poco la cabeza, me conformo 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 cuando analice logback.xml.
En tercer lugar, configure de manera programática el inicio de sesión en el código de la aplicación. (La documentación oficial de logback tiene un buen ejemplo de eso).
Hecho.