この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}
は定義済みのシステム変数です(echo $MY_HOME
Linuxでは正しいパスが表示されます。
問題は、logbackが適切に読み取っていないようで、ログをMY_HOME_IS_UNDEFINED/logs/my.log
私は何を間違えていますか?どうもありがとう!
編集:私は間違いを犯し、本当にMY_HOMEを意味するところにOSC_HOMEを置きました。ごめんなさい
他の人が言ったことに反して、 logback documentation明示的に述べている 「置換中、プロパティは最初にローカルスコープで、コンテキストスコープで2番目、システムプロパティスコープで3番目に、そしてOS環境では4番目で最後」。そのため、プロパティが環境で定義されている場合、logbackはそれを見つけます。
Eclipseでプロジェクトを実行するときに同じ問題が発生していました。それがあなたが抱えている問題である場合、それは実行構成->環境に行き、MY_HOME
環境変数に。
なぜネイティブ環境をデフォルトでロードしないのか、本当にわかりません。 「ネイティブ環境に環境を追加」というオプションもありますが、これは私には何の効果もありません。
構成ファイルから環境変数を読み取る別の方法があります。コンテキストリスナーを使用して、カスタム変数をログバックコンテキストに配置できます。
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
を意味します。構成ファイルには、OSC_HOME
の参照があります。詳細については、 変数置換 Logbackのルールを参照してください。
環境変数をJavaシステムプロパティとして渡すと、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>
Eclipseを使用している場合は、環境変数を取得するために再起動する必要がありますが、できない use:File-> Restart
代わりに、実際に完全にシャットダウンしてから再起動する必要がありますもう一度。