我有这个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}
是一个已定义的系统变量(linux上的echo $MY_HOME
显示正确的路径。)
事情是,logback似乎没有正确读取它,它将日志存储在MY_HOME_IS_UNDEFINED/logs/my.log
我做错了什么?非常感谢!
编辑:我犯了一个错误,把OSC_HOME放在我真正意味着MY_HOME的地方。抱歉,答案 0 :(得分:54)
与其他人所说的相反,logback documentation explicitly states“在替换期间,首先在本地范围中查找属性,在第二个上下文范围中,在系统属性范围第三个中查找属性, < em>在OS环境中第四个也是最后一个 “。因此,如果在环境中定义了属性,则logback将找到它。
在Eclipse中运行项目时遇到了同样的问题。如果这是你遇到的问题,可以通过转到运行配置 - &gt;来解决。环境并将MY_HOME
添加到环境变量。
不确定为什么默认情况下不加载本机环境。甚至还有一个名为“将环境附加到原生环境”的选项,这似乎对我没有任何影响。
答案 1 :(得分:25)
还有一种从配置文件中读取环境变量的替代方法。您可以使用上下文侦听器将自定义变量放入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) {
}
}
答案 2 :(得分:12)
您可能意味着MY_HOME
。在您的配置文件中有OSC_HOME
的参考。有关详细信息,请参阅Variable substitution Logback规则。
您可以将环境变量作为Java System属性传递,然后Logback将执行变量替换。您可以在命令行中将其作为JVM选项传递。例如:
java -DMY_HOME=${MY_HOME} -cp ... MainClass
或者您可以在配置文件中定义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>
答案 3 :(得分:1)
如果您正在使用Eclipse,则必须重新启动它以获取环境变量,但不能使用:文件 - &gt;重新启动
相反,您实际上必须完全关闭它,然后重新启动。
答案 4 :(得分:-2)
您可以使用tag在logback.xml中声明变量,而不是使用环境变量。
答案 5 :(得分:-4)
事情实际上是按照设计工作的:在执行变量替换时,logback根本不会读取环境变量。引用documentation:
替换变量的值可以在配置文件本身,外部属性文件或系统属性中定义。
因此,要么使用上述解决方案之一,要么获取OSC_HOME_IS_UNDEFINED
:)