2009-08-06 9 views
5

로깅 출력을 실행 당 고유 파일로 리디렉션하려는 기존 PSVM 응용 프로그램이 있습니다. 그래서 10시에 호출하면 출력을 {thread-id} -10 : 00.log로 리디렉션하게합니다. 또 하나의 실행 스레드가 10:01에 실행을 시작할 수 있고 그 출력은 {thread-id} -10 : 01.log로 갈 것입니다. 나는 이것이 우아하지 않다는 것을 이해합니다.로깅 애펜더를 동적으로 생성 및 파괴

내 질문은 :

  • 이 가능합니까?
  • 누군가 접근하는 방법에 대한 아이디어가 있습니까?
  • 더 이상 필요없는 appender를 해제하거나 파괴 할 수 있습니까?

감사합니다.

답변

4

나는 FileAppender으로 시작하여 자신을 생성하는 것으로부터 파생됩니다. 버전을 수정하여 현재 스레드 ID를 얻고 작성하기 전에 적절한 스레드 ID/타임 스탬프를 파일에 추가하십시오. 당신은 (버퍼링 된) FileWriters의 맵을 스레드 id에 키잉 (유지) 할 것입니다.

쓰기 appenders는 아주 사소한 - 그것을하는 방법에 here's a Javaworld guide입니다.

위의 경우 프로그램이 1 분 안에 두 번 시작될 가능성이 있습니까? 고유성을 유지하기 위해 프로세스 ID 또는 유사한 것을 추가 하시겠습니까?

+0

빠른 답변 감사드립니다. 하나의 스레드가 두 번 이상 그것을 수행하는 경우는 아닙니다. 그러나, 어쨌든 이것은 토론 목적의 예일뿐입니다. 이 이름은 고유성을 위해 범위가 지정됩니다. 파일 작성기를 해제하는 방법에 대한 아이디어가 있으십니까? –

+0

+1 좋은 자습서 링크 – WolfmanDragon

+0

다시. 해제. 난 당신이 모든 로그 메시지 (디스크에 쓰기를 보장하기 위해) 후 작가를 플러시해야한다고 생각하고 그것을 공개 걱정하지 마십시오. JVM이 모든 것을 처리하도록하십시오. 많은 스레드를 작성하고 많은 파일을 열지 않는 한. 그런 다음 'n'작가를 한 번에 열어 두지 않고 기록을 남기고 싶을 수 있습니다. 그 결과 일부 스 래싱이 발생할 수 있습니다. 그러나 –

1

적어도 log4j에서는 쉽게 처리 할 수 ​​없습니다. 그러나 logback (log4j의 후속 버전)이 포함 된 SiftingAppender을 보면, 더 이상 필요하지 않을 때 런타임 기준에서 appender를 생성하고 제거 할 수 있도록 설계되었습니다.

응용 프로그램을 시작할 때마다 하나의 로그 파일 만 만들어야하는 경우에는 타임 스탬프에 따라 로그 파일의 이름을 지정하면됩니다. 도움이 더 필요하면 logback-user 메일 링리스트를 외치십시오.

+0

왜 이것이 가능하지 않은지에 대해 더 많은 배경을 얻으 려합니다. 그것은 비교적 간단하게 보인다. 나는 logback-user에게 글을 올렸다. 나는 당신이 그것을 거기에서 발견 할 수 있고, 정교 할 수 있기를 바란다. 감사! –

+0

프로그래밍 방식으로 또는 구성 파일을 통해 사용자 정의 appender를 구성 할 것인지 여부에 따라 다릅니다. 또한 다중 스레드 응용 프로그램에서 로그 파일 (스레드 당 하나씩)을 관리하는 문제가 있습니다. 최초의 질문은 두 가지 문제와 관련하여 매우 구체적이지 않았습니다. – Ceki