로그 백 구성 파일에서 환경 변수 읽기
이 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에서는 올바른 경로가 표시됨).
문제는 로그 백이 제대로 읽지 못하는 것 같습니다. MY_HOME_IS_UNDEFINED/logs/my.log
내가 도대체 뭘 잘못하고있는 겁니까? 감사합니다!
편집 : 실수를 저질렀 고 실제로 MY_HOME을 의미하는 곳에 OSC_HOME을 넣었습니다. 미안합니다
다른 말한 것과 반대로, logback 문서 명시 상태 "교체 중, 특성 시스템 특성 범위 1/3, 문맥 범위 초 먼저 로컬 범위에서 조회되고, 그 운영체제 환경에서 제 마지막 " . 따라서 속성이 환경에 정의되어 있으면 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의 변수 대체 규칙을 참조 하십시오.
You can pass environment variable as a Java System property and then Logback will perform the variable substitution. You can pass this as JVM option in your command line. For example:
java -DMY_HOME=${MY_HOME} -cp ... MainClass
Or You can define MY_HOME in your config file itself.
<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>
If you're using Eclipse you have to restart it to pick up environment variables, but you can't use: File -> Restart
Instead you actually have to fully shut it down and then start it back up again.
Instead of using environmental variables, you can use tag to declare variables in logback.xml.
Things are actually working as designed: logback doesn't read environment variables at all when doing variable substitution. Quoting the documentation:
The value of the substituted variable can be defined in the configuration file itself, in an external properties file or as a system property.
So, either use one of the mentioned solutions or get OSC_HOME_IS_UNDEFINED
:)
'development' 카테고리의 다른 글
인터페이스 빌더-경로에서 디자인 가능 항목을로드하지 못했습니다 (null). (0) | 2020.12.12 |
---|---|
bash 스크립트 내에서 ssh하는 방법은 무엇입니까? (0) | 2020.12.12 |
셀레늄이 아약스 응답을 기다리도록하는 방법? (0) | 2020.12.12 |
MySQL의 대소 문자 구분 데이터 정렬 (0) | 2020.12.12 |
문자열 일치 후 단어를 가져 오는 정규식 (0) | 2020.12.12 |