2012-10-31 4 views
9

아이디어는 재배포하지 않고 로그백 구성을 변경하는 기능을 만드는 것입니다. 프로젝트에서 Slf4j 및 로그백이 사용됩니다. logback.xml 파일은 귀중하지만 귀중한 속성 파일에서 일부 속성을 읽습니다. 그런 뭔가 :재배포하지 않고 로그백 구성 업데이트

<configuration scan="true" scanPeriod="5 seconds"> 
<property file="${logconfig}"/> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>${logback.consolePattern}</pattern> 
    </encoder> 
</appender> 
<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
</root> 

</configuration> 

문제 스캔 검사 logback.xml 변경 (항상 같은 파일) 된 경우이다. 그래서 특성 파일의 값을 변경해도 로그백 구성이 변경되지 않습니다. 변경 사항은 재배포 후에 만 ​​적용됩니다.

재배포하지 않고 로그백 구성을 수정할 수있는 가장 좋은 방법은 무엇입니까? 그것을 실현할 수있는 메커니즘이 있습니까?

업데이트 : 변경 사항이 매우 드물게 발생합니다. 그러나 가능한 한 빨리 적용해야합니다. 성능 또한 중요합니다.

+1

당신은 프로그래밍에 대한 몇 가지 더미 변경할 수 없습니다 logback.xml 파일을 다시로드합니까? 파일 끝에 빈 줄을 추가하거나 제거하는 것과 같은가? – rolve

+0

@그런 일에 대해 생각했습니다. 그러나 그렇게하기위한보다 편리한 방법이 필요하기를 바랍니다. – error1009

답변

0

약간의 비교를 거친 후에 logback.xml을 귀로부터 꺼내는 것이 더 쉽고 편할 것이라고 생각합니다. 서버 구성에서 시스템 특성 logback.configurationFile을 지정하여이를 실현할 수 있습니다. 사람들이보다 편리하게 편집 할 수 있도록 파일 시작 부분에 일부 속성을 정의 할 계획입니다. 그

<property name="consolePattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> 

다음 구성에서 사용할처럼

<pattern>${consolePattern}</pattern> 

그것은 역동적 인 변화와 함께 문제를 처리하고 거의 사용자 친화적 인))

5

나는이 일을하여 다시로드 관리 : 내 사용의 경우

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
loggerContext.reset(); 
ContextInitializer ci = new ContextInitializer(loggerContext); 
ci.autoConfig(); 

, 내가 수행하여 상황에 맞는 몇 가지 속성을 추가하는 작업을 수행합니다

loggerContext.putProperty("logDirectory", getLogDirectory().getAbsolutePath()); 

을 autoConfig를하기 전에.

속성 파일에서 속성을 읽는 것도 효과가 있습니다.

+0

슬프게도 LoggerContext는 로그백 클래스이므로 응용 프로그램 코드가 인터페이스 대신 로깅 구현을 인식해야합니다. 이것은 물론 포스터가 로깅 외관으로 slf4j를 사용한다고 가정 할 때 권장됩니다. –

+0

그래서 속성 파일의 변경 사항을 확인하도록 제안합니다. 속성이 변경된 경우 구성을 다시로드 하시겠습니까? 작동해야하지만 성능에 좋지 않다고 생각합니다. – error1009

3

아마도 "touch"명령은 속성 설정 후 가상의 파일 수정에 유용 할 것입니다.

관련 문제