logback.xml에서 스프링 속성 자리 표시자를 사용할 수 없습니다.
로그백을 사용한 Spring Boot 콘솔 앱이 있습니다.모든 속성(앱 및 Logback용)은 클래스 경로의 표준 application.properties 파일로 외부화됩니다.이러한 속성은 앱 자체에서는 정상적으로 선택되지만 logback.xml 파일에서는 선택되지 않습니다.spring boot이 기동하기 전에 logback.xml이 처리되는 것처럼 보이기 때문에 EL 플레이스 홀더는 처리되지 않습니다.
FileNamePattern을 예로 들면 application.properties에는 다음과 같은 내용이 있습니다.
log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}
logback.xml에는 다음과 같이 표시됩니다.
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.logDirectory}${log.filePattern}.log
</FileNamePattern>
</rollingPolicy>
앱 실행 시 다음과 같은 오류가 나타납니다.
ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:25 -
RuntimeException in Action for tag [rollingPolicy]
java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken
Spring Boot이 아닌 다른 Spring Boot 앱에서도 같은 코드가 정상적으로 동작하기 때문에 Spring Boot의 동작은 조금 다른지 궁금합니다.
솔루션:
@Gary 답장 고마워요!Spring EL과 Logback 변수 간의 차이점에 대해 알아두면 좋습니다.나는 그 변수들을 해석하는 일을 나를 위해 담당한 사람이 스프링이라고 생각했다.난 그런 요소를 가지고 있었지만, 그게 날 생각하게 했어.
application.properties 파일이 항아리 밖에 있어서 Logback은 찾을 수 없었습니다.Spring 관련 속성을 외부 application.properties 파일에 보관하고 로깅 관련 속성을 application-internal.properties 파일(항아리 안에 있음)로 이동한 후 해당 파일을 Logback으로 가리킴(<property resource="application-internal.properties" />
)는 모든 것을 예상대로 작동시켰습니다!
Spring Boot 1.3 이후로는 spring 속성을 logback-spring.xml 설정으로 가져오는 방법이 개선되었습니다.
이제 "spring Property" 요소를 추가할 수 있습니다.
<springProperty name="destination" source="my.loggger.extradest"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${destination}</file>
...
</file>
</appender>
https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f
편집: Anders 덕분입니다.
.........
${...}
봄의 '스프링 EL'이 아니라 부동산 플레이스 홀더입니다.
로그백 "변수"를 스프링 "프로퍼티 플레이스 홀더"와 혼동하고 있는 것 같습니다.
그들은 우연히 같은 구문을 사용했을 뿐이다.${...}
.
logback은 Spring 속성 자리 표시자 메커니즘에 대해 아무것도 모르고 그 반대도 모릅니다.로그백 변수는 로그백 매뉴얼에 따라 설정해야 합니다.application.properties
application.yml
이는 엄밀하게는 스프링(부트) 개념입니다.
편집:
로그백 문서를 간단히 확인한 후 추가
<property resource="application.properties" />
logback.xml
작동해야 합니다.
, 「 」를 합니다.<springProperty>
, 에는 「」, 「」라고 하는 이름을 붙여야 한다는 것입니다.logback-spring.xml
을 '아예'라고 안 logback.xml
.spring-boot 1.3.5.RELEASE
)
은 주로 솔 mostly mostly mostly mostly mostly mostly mostly에 대해 합니다.bootrap.properties
현재밖에 없습니다.「 」 、 「 」 、 「 Spring Config Server 」
@Component
public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {
@Autowired protected Environment environment;
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
// enviroment here has already loaded all properties and you may alter logback config programatically
ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
}
}
다음은 새 Appender를 사용하여 로그백을 사용자 지정하는 좋은 예입니다.
Spring 속성을 Logback 속성에 매핑하고 조건:
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/>
<!-- defined in the application-prod.properties/>-->
<springProperty scope="context" name="SPRING_WRITER_DISABLED" source="writer.disabled"/>
<property name="LOGBACK_WRITER_DISABLED" value="${SPRING_WRITER_DISABLED}"/>
<if condition='property("LOGBACK_WRITER_DISABLED").equals("false")'>
<then>
<appender name="testappender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ACTIVE_PROFILE}/${HOSTNAME}/testappender.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
{ACTIVE_PROFILE}/${HOSTNAME}/testappender-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>300MB</maxFileSize>
<maxHistory>3</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="testappender" level="INFO" additivity="false">
<appender-ref ref="testappender"/>
</logger>
</then>
</if>
</configuration>
언급URL : https://stackoverflow.com/questions/29322709/unable-to-use-spring-property-placeholders-in-logback-xml
'source' 카테고리의 다른 글
Oracle의 인덱스 구성 테이블을 사용해야 하는 경우아니면, 언제 하면 안 될까요? (0) | 2023.03.18 |
---|---|
초보자용 XSLT 레퍼런스 (0) | 2023.03.18 |
ng-repeat 및 limitTo를 사용하여 표시되는 항목 수 제한 (0) | 2023.03.18 |
오브젝트가 비어 있는지 확인하고 컨트롤러에서 ng-show로 동작하지 않는지 확인합니다. (0) | 2023.03.18 |
ngRepeat inside angularjs 디렉티브의 $index (0) | 2023.03.18 |