[java] log4j가 자체 구성에 사용한 파일을 표시하도록 할 수 있습니까?

질문

Log4J가 구성에 사용한 파일의 전체 경로를 표시하도록 할 수 있습니까?


배경

나는 log4j와 애증 관계가 있습니다. 좋은시기에는 훌륭하지만 작동하지 않을 때는 디버깅하기 가장 어려운 일 중 하나가 될 수 있습니다. 애플리케이션의 모든 로깅을 관리합니다. 따라서 저는 매뉴얼에 정의 된 로깅과 기본 초기화 절차에 매우 익숙 합니다. 그래도 몇 주마다 로그 기록이 중단되고 문제를 해결 하는많은 시간을 소비 하는 것 같습니다 .

이번에는 심하게 깨졌습니다. 모든 곳의 모든 로그 문이 콘솔에 덤프되고 이유를 알 수 없습니다. 지난주에 내 log4j.xml 파일을 사용한 것과 동일한 코드 기반이 갑자기 다른 구성을 사용하고 있습니다. 명백한 것은 변경되지 않았습니다. 내 유일한 추측은 몇 가지 종속성이 변경되었으며 Maven이 모든 것을 파괴하는 사악한 JAR을 다운로드했다고 의심합니다.

Log4J가 시작할 때 사용하기로 결정한 구성 파일을 알아낼 수만 있다면 이 문제와 대부분의 다른 문제를 쉽게 해결할 수 있습니다.


요약

Log4J에 구성에 사용 된 파일을 인쇄하도록 지시하는 방법이 있습니까? 또는 실행중인 응용 프로그램을 중단하고 디버거를 사용하여이 질문에 답할 수있는 방법이 있습니까 (식을 사용하거나 변수를 검사하여)?



답변

예, log4j.debugJVM 시스템 변수에 추가 하기 만하면 됩니다. 예를 들면 :

java -Dlog4j.debug -cp ... some.class.name

Log4j는 다음과 같은 결과를 출력합니다.

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f7182c1.
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
log4j: System property is :null
log4j: Standard DocumentBuilderFactory search succeded.
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
log4j: debug attribute= "null".
log4j: Ignoring debug attribute.
log4j: reset attribute= "false".
log4j: Threshold ="null".
...

참고로 매뉴얼FAQ 를 참조하십시오 .


답변

저는 Log4J2를 사용하고 있으며 Java 프로그램 내부에서 파일을 얻으려면 이것이 저에게 효과적이었습니다.

LoggerContext lContect = LogManager.getContext();
Field f = lContect.getClass().getDeclaredField("configuration");
f.setAccessible(true);
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect);
System.out.println("Config File: " + iWantThis.getName());


답변

이에 상응하는 log4j 2 <Configuration status="trace">는 구성 파일에 설정됩니다. 그러면 log4j2 구성 파일이로드 된 위치와 log4j2 구성 프로세스의 기타 내부 세부 정보가 표시됩니다. 기본적으로 상태 로거 수준은 WARN이므로 문제가있는 경우에만 알림이 표시됩니다.

구성 파일을 올바르게 찾을 수없는 경우에도 시스템 속성 org.apache.logging.log4j.simplelog.StatusLogger.level을 로 설정하여 log4j2 내부 상태 로깅을 활성화 할 수 있습니다 TRACE.


답변