2014-09-16 4 views
1

배포자가 Tomcat webapp log4j2 RollingFileLogger의 경로를 지정하도록 허용해야합니다. 나는 JNDI를 사용하고 싶지만 평범한 -D 매개 변수를 사용할 수있다. This apache page 꽤 잘 설명하는 것 같습니다.log4j2의 매개 변수 대체

문제가 해결되지 않습니다. 나는 JNDI에서 특별히 경험하지 않는다는 것을 인정할 것이다. 그러나 나는 간단한 JVM 매개 변수를 사용할 수조차 없다. 읽기에 대해 Property Substitution 나는 $$ {jndi : xxxx}를 파일 이름 속성에 넣을 수는 없으며 $ {xxx} 속성 대체를 사용해야한다는 인상을 받았습니다. 불행히도 그 속성을 대체 잘 조회 jndi 또는 env도 해결하는 동안 작동합니다.

log4j2.xml :

<Properties> 
     <Property name="filename">$${jndi:logPath/directory}/ief.log</Property> 
    </Properties> 
    .... 
    <RollingFile name="RollingFileLogger" fileName="${filename}" immediateFlush="false" append="true" 

결과 :

2014-09-16 14:44:46,284 ERROR Unable to create file ${jndi:logPath/directory}/ief.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect 

는 속성이 대체되어 있지만 조회가 완료되지 볼 수 있듯이

. context.xml 항목의 모양이 확실하지 않습니다. 하지만 내 추측이다 : 나는 log4j에 버전 2.0을 사용하지만 꽤 확신하고

<Resource name="logPath" 
    auth="Container" 
    directory="/tmp" /> 

이 내 오해하지 버그입니다. 내가 잘못하고있는 것을 해결하는 데 도움이된다면 크게 감사 할 것입니다.

답변

0

Tomcat 7에서 작동 할 JNDI 브라우저를 찾지 못했습니다. 그러나 그것은 바보 같은 문제로 판명났습니다. 나는 이것을 환경 대신에 자원으로 정의했다.

<Environment name="logPath" 
    auth="Container" 
    type="java.lang.String" 
    value="/tmp" /> 

그리고 log4j2 조회는 다음과 같습니다 :처럼 그냥 레코드에 대한의 context.xml이 보일 것입니다

<Property name="logName">$${jndi:logPath}/iefrest.log</Property> 
    <Property name="patternName">$${jndi:logPath}/iefrest</Property> 
... 
<RollingFile name="RollingFileLogger" fileName="${logName}" immediateFlush="false" append="true" 
      filePattern="${patternName}-%d{yyyyMMdd-HH}.log.gz"> 

그것은 주목할 가치가 있다는 : 명확하게 설명되어 있습니다 "자바 완/ENV"(나 같은 JNDI에 대한 깊은 지식이없는 사람들을 오도하는 것은 실제로 Environment XML 요소에 매핑되며 name 속성의 접두사를 의미하지는 않습니다.

Log4J2 사전에서 파일 이름 속성이 제공된대로 정확하게 취해지는 것도 흥미 롭습니다. 특히 filename = "$ {logName} .log"라고 말할 수는 없습니다. 이렇게하면 원하는 결과가 파싱되지 않습니다. 그러나 예상되는 연결은 filepattern 속성에서 발생합니다. 불일치하지만 관리하기 어려운 것은 아닙니다.

0

$${jndi:logPath/directory}을 지정하면 조회에서 접두어 java:comp/env/이 추가되어 조회 할 전체 값은 java:comp/env/logPath/directory이됩니다. (이 접두어는 jndi 검색 키에 이미 ':' 문자가 포함되어 있으면 추가되지 않습니다.) JNDI 브라우저를 사용하여 예상 값을 제공하는지 확인할 수 있습니다.

이 조회 중에 발생한 오류는 WARN 수준의 상태 기록기에 기록됩니다. 상태 기록이 콘솔에 나타납니다. log4j2.xml 구성 파일에 <Configuration status="trace" ...을 지정하여 상태 로그를 사용 가능하게 할 수 있습니다.