2011-02-01 4 views
1

Java.util.Logger를 사용하여 내 프로젝트의 다양한 이벤트를 기록합니다. 파일 처리기를 사용하여 로그를 만듭니다. 이벤트가 로그에 기록되는 속도 (디스크에서)는 이벤트가 발생하는 속도와 거의 같습니다. 이것은 동시에 좋고 나쁜 것 같습니다. 이벤트 업데이트가 빠르게 작성되었으므로 좋지만 IO 시간이 걱정됩니다. 때로는 로그에 기록해야하는 많은 데이터가 있습니다. 따라서 이러한 경우, 내 프로그램이이 로깅 때문에 느리게 실행되는 것이 바람직하지 않습니다.자바 로거에 대한 Optmizing 디스크 쓰기

누군가이 경우 내가해야 할 것을 제안 할 수 있다면 큰 도움이 될 것입니다. 이벤트가 기록되는 속도에 신경 쓰지는 않습니다. 실행이 끝나면 로그 파일에 있어야합니다.

감사합니다.

+0

로그 이벤트를 메모리에 버퍼링하는 경우 응용 프로그램이 충돌합니다. 일반적으로 정확히 무엇을 말하고 싶은지 알고 싶습니다. –

답변

0

널리 사용되는 log4j과 같은 다른 로깅 솔루션을 사용해 보는 것이 좋습니다 (흔히 commons-logging과 함께 사용). 로깅에 대한 효율적인 접근 방식을 제공합니다.

그러나 더 많은 제어가 필요하면 자신의 appender를 구현할 수 있습니다. 파일 첨부자를 원할 경우 FileAppenderappend 루틴을 무시할 수 있습니다. 전체 디버그 로깅을 실행할 때

일예로는,

public class BatchingFileAppender extends FileAppender { 
    private List<LoggingEvent> batch = new LinkedList<LoggingEvent>; 
    public static final int BATCH_SIZE = 10; 


    @Override 
    protected void append(LoggingEvent event) { 
     batch.add(event); 

     // you can even optionally push ever 10'th or so messages to file 
     if (batch.size() == BATCH_SIZE) { 
      appendBatch(); 
     } 
    } 

    @Override 
    protected void reset() { 
     appendBatch(); 
    } 

    @Override 
    protected void closeWriter() { 
     appendBatch(); 
    } 

    private void appendBatch() { 
     for(LoggingEvent event : batch) { 
      super.append(event); 
     } 
     batch.clear(); 
    } 

} 
+0

내장 AsyncAppender를 사용하는 것보다 자신의 버퍼를 롤링하면 어떤 이점이 있습니까? –

+0

이 방법을 사용하면 응용 프로그램 종료시 모든 로깅 이벤트를 수행 할 수 있습니다 (위의 코드를 약간 수정). –

2

은 5 ~ 10 %의 성능 손실이 예상된다. 이것은 우리 고객에게 받아 들여지는 것 같습니다.

코드가 로그 아웃 할 콘텐츠의 일부를 생성하는 경우

이 코드를 실행하지 않도록하기 위해이 같은 간단한 테스트를 사용하는 것을 고려 디버그가 꺼져있을 때 비싼 :

if (log.isLoggable(Level.FINEST)) { 
    // code to generate the log entry 
} 

당신은 또한 java.util.logging.MemoryHandler을 만들 수 있습니다 정기적 인 간격으로 파일로 푸시합니다.

+0

감사합니다. Jochen, MemoryHandler가 내 응용 프로그램에 적합해야합니다. 당신의 도움을 주셔서 감사합니다. – Vandana

0

비동기/버퍼 된 부속 장치를 지원하는 log4j 또는 slf4j과 같은 최신 로깅 라이브러리를 사용하십시오.

log4j에, 당신은 그것을 (버퍼링 기능을 제공합니다) AsyncAppender 및 와이어 최대 FileAppender를 사용할 수 있습니다

이 보낸 이벤트를 수집하고 모든 어 펜더에 파견됩니다 AsyncAppender 그 첨부되어 있습니다. AsyncAppender에 여러 개의 첨부자를 첨부 할 수 있습니다.

AsyncAppender는 별도의 스레드를 사용하여 버퍼의 이벤트를 제공합니다.

이렇게하면 이벤트가 제어 된 방식으로 디스크에 기록되고 실제 작업을 수행하는 스레드는 디스크 입출력과 연결되지 않습니다.

또는 더 간단한 옵션으로,이 프로그램을 실행할 때 실제로 전체 로그 출력이 필요한지 고려하십시오. DEBUG 수준에서 로깅을 사용하여 프로덕션 환경에서 응용 프로그램을 실행하는 것은 종종 과잉입니다.

+0

감사합니다. Matt. 이것은 완벽 해. – Vandana

1

Jochen Bedersdorfer의 답변은 좋은 것이며 just4log은 후 처리를 통해 자동으로 처리하는 시스템입니다. 따라서 로그 문 주위에 if 문을 사용하여 코드를 추악하게 만들 필요가 없습니다.

0

Logback을 확인해야합니다. 내가 실수하지 않으면 log4j와 같은 저자. log4j에에 이전 작업을 바탕으로

는 logback 내부는 중요한 특정 실행 경로에 약 10 배 빠른 수행 다시가 작성되었습니다. 로그백 구성 요소는 더 빠를뿐만 아니라 작은 메모리 풋 프린트도 가지고 있습니다.

1

Pexus는 최근 java.util.logging. * API를 기반으로하는 응용 프로그램 로거를 포함하는 PerfLog라는 오픈 소스 성능 로깅 패키지를 출시했습니다. 여기에는 모든 J2EE 컨테이너 (1.4+)에서 사용할 수있는 Common J Work Manager를 사용하는 비동기 로깅 옵션이 포함되어 있습니다. 자세한 내용은 http://www.pexus.com/perflog

+2

스택 오버플로에 오신 것을 환영합니다! 답변을 게시 해 주셔서 감사합니다. [Self-Promotion에 대한 FAQ] (http://stackoverflow.com/faq#promotion)를주의 깊게 읽으십시오. 또한 자신의 사이트/제품에 링크 할 때마다 면책 조항을 게시하는 것이 필수적입니다. –

관련 문제