에 철저한 외부 인터페이스를하는 방법을 찾을 수 없습니다 나는 기본적으로 그냥 같은 질문에 대한 답변과 나는 힘든 나는 여기에 내 대답을 공유 할 수 있습니다. complete answer available here을 읽어 보시기 바랍니다. 여기에 요약을 제공하고 현재 상황에 대한 나의 대답을 적용하려고 노력할 것입니다.
첫 번째 버전에서 Log4j는 수동으로 종료 절차를 호출하는 API를 제공하고있었습니다. 우리는 지식이 없기 때문에 it was removed from the second version입니다. 이제, 존재하지 않는 문서에 따르면 올바른 방법은 종료 절차를 담당하는 ShutdownCallbackRegistry
인터페이스의 구현을 제공하는 것입니다.
나는이 문제를 해결하기 위해 무슨 짓 제안 된 솔루션을
나는 ShutdownCallbackRegistry
인터페이스의 내 자신의 버전을 구현한다는 것입니다. 대부분은 디폴트의 구현과 같은 일을 합니다만, JVM에의 슛 다운 훅으로서 등록하는 대신, 수동으로 호출 할 때까지 대기합니다.
GitHub/DjDCH/Log4j-StaticShutdown에서 전체 솔루션과 지침을 찾아보고 자신의 프로젝트에서 사용할 수 있습니다. 기본적으로, 마지막에, 당신은 단지 응용 프로그램에서 같은 것을 할 필요가 :
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
// Do your usual shutdown stuff here that need logging
} finally {
// Shutdown Log4j 2 manually
StaticShutdownCallbackRegistry.invoke();
}
}
}));
나는 이것이 완벽한 해결책이 있는지 의심의 여지없이 내 구현 완벽이라고 말할 수는 없지만, 내가 시도 그것을 올바른 방법으로 행하는 것. 이 솔루션이 적절하거나 적절하지 않은 경우 귀사의 의견을 듣게되어 기쁩니다.
로깅 또는 종료 훅의 다른 서비스에 따라 계속해서 나쁜 습관이되었습니다. 이제는 따라 잡고 있습니다. –
@MarkoTopolnik 당신이 말한대로 나쁜 습관이라면, 셧다운 훅 스레드의 출력이 기록/기록을 필요로 할 때 무엇을 제안하겠습니까? – vegemite4me
셧다운 훅에서는 초기화 된 상태의 어떤 부분도 여전히 존재한다고 믿을 수 없기 때문에 세미 - 안정적인 것으로 보이는 유일한 것은 파일을 생성하고 그것에 쓰는 완전 독립된 코드 조각입니다. 코어 덤프가 이루어지는 방식과 비슷합니다. –