2012-03-01 197 views
1

在变量替换期间logback是否读取环境变量?我在应用程序启动过程中在控制台上获得了REM_HOME_IS_UNDEFINED。虽然变量存在。手册说env变量在食物链中最后被查找。 http://logback.qos.ch/manual/configuration.html#variableSubstitution无法读取logback中的env变量

下面是我在做什么:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${REM_HOME}/reac/logs/reac.log</file> 

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${REM_HOME}/reac/logs/archives/reac-%i.log.zip</fileNamePattern> 
     <minIndex>1</minIndex> 
     <maxIndex>3</maxIndex> 
    </rollingPolicy> 

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>5MB</maxFileSize> 
    </triggeringPolicy> 

    <encoder> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{36} %-5level - %msg%n</pattern> 
    </encoder>  
</appender> 

回答

2

这里是我最后做:

我读的环境变量并调用System.setProperty将值设置为系统变量,重置loggercontext。

System.setProperty(REM_HOME, remHome); 

     LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 

     try { 
      JoranConfigurator configurator = new JoranConfigurator(); 
      configurator.setContext(context); 

      // Call context.reset() to clear any previous configuration, e.g. default 
      // configuration. For multi-step configuration, omit calling context.reset() 
      context.reset(); 
      configurator.doConfigure(getClass().getClassLoader().getResourceAsStream(LOG_CONF_FILE)); 
     } 
     catch (JoranException je) { 
      // StatusPrinter will handle this 
      je.printStackTrace(); 
     } 
     StatusPrinter.printInCaseOfErrorsOrWarnings(context); 
0

显然,这个错误说,你的java程序不能老是明白这个变量(REM_HOME),所以你有两个解决方案添加新的环境变量称为REM_HOME或作出新的属性文件,并告诉的logback cofig文件来使用它(添加下面一行到你的代码)

<property file="path_to_your_File/YourFileName.properties"/> 

,然后在属性文件中定义要使用就像波纹管的vriable:

REM_HOME=Path_to_your_location