从logbackconfiguration文件读取环境variables

我有这个logback.xml文件:

<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> 

${MY_HOME}是一个已定义的系统variables(linux上的echo $MY_HOME显示了正确的path)。

事情是logback似乎没有正确读取,它将日志存储在MY_HOME_IS_UNDEFINED/logs/my.log

我究竟做错了什么? 非常感谢!

编辑:我犯了一个错误,把OSC_HOME我真正的意思是MY_HOME。 对于那个很抱歉

与其他人所说的相反, logback文档明确指出 :“在replace过程中,首先在本地范围内查找属性,在​​上下文范围内,在系统属性范围内第三, 在OS环境中第四个和最后一个 ” 。 所以如果在环境中定义属性,logback将会find它。

在Eclipse中运行我的项目时遇到同样的问题。 如果这是你遇到的问题,可以通过运行configuration – >环境,并添加MY_HOME到环境variables来解决。

不太确定为什么它默认不加载本地环境。 甚至有一个选项叫“将环境附加到本地环境”,这对我来说似乎没有任何影响。

有一种替代方法来从configuration文件中读取环境variables。 你可以把你的自定义variables与上下文监听器进行logback上下文。

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) { } } 

你可能是指MY_HOME 。 在你的configuration文件中有OSC_HOME参考。 有关详细信息,请参阅Logback的variablesreplace规则。

您可以将环境variables作为Java系统属性传递,然后Logback将执行variablesreplace。 您可以在命令行中将其作为JVM选项传递。 例如:

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

或者你可以在你自己的configuration文件中定义MY_HOME。

 <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> 

如果您使用的是Eclipse,则必须重新启动才能使用环境variables,但不能使用:File – > Restart

相反,你必须完全closures它,然后重新启动它

您可以使用tag来声明logback.xml中的variables,而不是使用环境variables。

事情实际上是按照devise工作的:在进行variablesreplace时,logback根本不读取环境variables。 引用文档 :

replacevariables的值可以在configuration文件本身,外部属性文件或系统属性中定义。

所以,或者使用上面提到的解决scheme之一,或者得到OSC_HOME_IS_UNDEFINED 🙂