2009-12-29 18 views
39

que tienen este archivo logback.xml:Leer variables de entorno de fichero de configuración logback

<configuration debug="true" scan="true" scanPeriod="60 seconds"> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> 
    </layout> 
    </appender> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <File>${MY_HOME}/logs/mylog.log</File> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <FileNamePattern>logs/my.%d{yyyy-MM-dd}.log</FileNamePattern> 
     <MaxHistory>30</MaxHistory> 
    </rollingPolicy> 

    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern> 
    </layout> 

    </appender> 

    <root level="TRACE"> 
    <appender-ref ref="FILE"/> 
    </root> 

</configuration> 

Y ${MY_HOME} es una variable definida por el sistema (echo $MY_HOME en Linux muestra el camino correcto).

La cosa es que logback no se parece a leer correctamente, almacena los registros bajo MY_HOME_IS_UNDEFINED/logs/my.log

¿Qué estoy haciendo mal? ¡Muchas gracias!

EDIT: cometí un error y puse OSC_HOME donde realmente quise decir MY_HOME. Lo siento por eso

Respuesta

8

Quizás quieras decir MY_HOME. En su archivo de configuración hay referencia para OSC_HOME. Consulte Variable substitution reglas de Logback para más detalles.

Puede pasar la variable de entorno como una propiedad del sistema Java y Logback realizará la sustitución de la variable. Puede pasar esto como una opción de JVM en su línea de comando. Por ejemplo:

java -DMY_HOME=${MY_HOME} -cp ... MainClass 

O Puede definir MY_HOME en su propio archivo de configuración.

<configuration debug="true" scan="true" scanPeriod="60 seconds"> 
    <property name="MY_HOME" value="/home/my" /> 
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <File>${MY_HOME}/logs/mylog.log</File> 
    </appender> 
</configuration> 
+1

Desde el enlace en su respuesta: "Durante la sustitución, las propiedades se buscan en el ámbito local en primer lugar, en el ámbito contexto en segundo lugar, en el ámbito de las propiedades del sistema tercero, y *** en el entorno OS cuarto y última***." Entonces debería estar mirando las variables de ambiente ¿verdad? –

+1

@TimPote Sí, se examinarán las variables de entorno del sistema operativo –

-4

Las cosas funcionan en realidad como se diseñaron: logback no lee variables de entorno en absoluto al hacer la sustitución de variables. Citando documentation:

El valor de la variable sustituida se puede definir en el propio archivo de configuración, en un archivo de propiedades externo o como una propiedad del sistema.

Así que, o utilizar una de las soluciones mencionadas o conseguir OSC_HOME_IS_UNDEFINED :)

+0

Logback lee las variables de entorno del sistema operativo. En [Scopes] (http://logback.qos.ch/manual/configuration.html#scopes) se menciona el "entorno de SO" que es un enlace a la documentación de Oracle sobre las variables de entorno –

+1

. La cita anterior implica que las variables de entorno del SO son No soportado. Sin embargo, no pude encontrar la cita anterior en la documentación. Los documentos actuales mencionan explícitamente las variables de entorno del sistema operativo. – Ceki

44

Al contrario de lo que los otros han dicho, el logback documentation explicitly states que "Durante la sustitución, las propiedades se buscan en el ámbito local en primer lugar, en el ámbito de contexto segundo, en el tercer ámbito de propiedades del sistema y en el entorno del sistema operativo cuarto y último ". Entonces, si la propiedad está definida en el entorno, logback lo encontrará.

Estaba teniendo el mismo problema al ejecutar mi proyecto en Eclipse. Si ese es el problema que tiene, se puede solucionar yendo a Configuraciones de ejecución -> Entorno y agregando MY_HOME a las variables de entorno.

No estoy seguro de por qué no está cargando el entorno nativo de manera predeterminada. Incluso hay una opción llamada "Añadir entorno al entorno nativo" que no parece tener ningún efecto para mí.

+1

Las variables de entorno me funcionan, pero tuve que reiniciar Eclipse para que las recogieran. Vea mi respuesta a esta pregunta –

+0

Esto es lo mismo para IntelliJ IDEA. Un reinicio completo de la aplicación recogerá las variables de entorno. – Jelle

1

Si utilizas Eclipse hay que reiniciarlo para recoger las variables de entorno, pero que no puede uso: Archivo -> Reiniciar

En lugar de que realmente tenga que cerrar completamente hacia abajo y luego vuelva a iniciarlo nuevamente.

14

Hay una manera alternativa de leer las variables de entorno del archivo de configuración. puede poner sus variables personalizadas en el contexto de inicio de sesión con el oyente de contexto.

logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true" scan="true" scanPeriod="30 seconds"> 

    <!-- THIS IS OUR CUSTOM CONTEXT LISTENER --> 
    <contextListener class="com.myapp.logging.listener.LoggerStartupListener"/> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>[%-5level] %d{HH:mm:ss.SSS} [%.6thread] %logger - %msg%n</pattern> 
      <charset>UTF-8</charset> 
     </encoder> 
    </appender> 

    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${MY_HOME}/${LOG_FILE}.log</file> 
     <append>true</append> 
     <!-- Support multiple-JVM writing to the same log file --> 
     <prudent>true</prudent> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <!-- Daily rollover --> 
      <fileNamePattern>${MY_HOME}/${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern> 
      <!-- Keep 7 days' worth of history --> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
     <encoder> 
      <pattern>[%-5level] %d{HH:mm:ss.SSS} [%.6thread] %logger - %msg%n</pattern> 
      <charset>UTF-8</charset> 
     </encoder> 
    </appender> 

    <root level="INFO"> 
     <appender-ref ref="STDOUT"/> 
     <appender-ref ref="FILEOUT"/> 
    </root> 
</configuration> 

LoggerStartupListener.java

package com.myapp.logging.listener; 

import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.classic.spi.LoggerContextListener; 
import ch.qos.logback.core.Context; 
import ch.qos.logback.core.spi.ContextAwareBase; 
import ch.qos.logback.core.spi.LifeCycle; 

public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { 

    private static final String DEFAULT_LOG_FILE = "MYAPP"; 

    private boolean started = false; 

    @Override 
    public void start() { 
     if (started) return; 

     String userHome = System.getProperty("user.home"); 

     String logFile = System.getProperty("log.file"); // log.file is our custom jvm parameter to change log file name dynamicly if needed 

     logFile = (logFile != null && logFile.length() > 0) ? logFile : DEFAULT_LOG_FILE; 

     Context context = getContext(); 

     context.putProperty("MY_HOME", userHome); 
     context.putProperty("LOG_FILE", logFile); 

     started = true; 
    } 

    @Override 
    public void stop() { 
    } 

    @Override 
    public boolean isStarted() { 
     return started; 
    } 

    @Override 
    public boolean isResetResistant() { 
     return true; 
    } 

    @Override 
    public void onStart(LoggerContext context) { 
    } 

    @Override 
    public void onReset(LoggerContext context) { 
    } 

    @Override 
    public void onStop(LoggerContext context) { 
    } 

    @Override 
    public void onLevelChange(Logger logger, Level level) { 
    } 
} 
+0

Registros necesarios para incluir la id de instancia de aws ec2. Este era el enfoque que tenía que tomar. – n00b

-2

En lugar de utilizar las variables ambientales, puede utilizar la etiqueta para declarar variables en logback.xml.

Cuestiones relacionadas