2013-08-28 5 views
1

나는 광범위하게 멀티 스레드 된 Java에서 거래 응용 프로그램 (한 번에 데이터 백만)을 작성 중입니다. 응용 프로그램은 메시지를 로그 파일에 기록합니다. 현재이 로깅의 성능은 매우 낮으며 CPU 시간이 많이 걸립니다.다중 로그인 응용 프로그램에 로그인

나는 그것을 구현하고 싶다. 나는 googled하고 찾을 수 LinkedBlockingQueue 옵션으로. 고정 크기 때문에 arrayBlockingQueue을 사용할 수 없습니다.

또한 log4j와 같은 프레임 워크는 스레드 안전성 때문에 좋은 옵션으로 들립니다. 그러나 log4j가 멀티 스레드 응용 프로그램을위한 좋은 옵션 성능면인지는 의심 스럽습니다.

내 멀티 스레드 응용 프로그램에서 로깅을 수행 할 때 선택해야하는 최상의 데이터 구조/프레임 워크는 무엇이 있습니까?

+0

검증 된 로깅 프레임 워크를 사용하십시오. 합리적인 시간 내에 디자인 할 수있는 것보다 더 효율적입니다. – assylias

답변

1

내가 너라면, 먼저 slf4j을 시도 할 것입니다. 이것은 외관 일 뿐이지 만 구현으로 log4j2을 사용할 수 있습니다. 이 느리면 JUL 및 기타 로깅 프레임 워크를 사용하기가 정말 쉽습니다. 그것은 단지 구성과 클래스 패스 변경 일뿐입니다.

시도하는 모든 로거가 느린 경우 http://zeromq.org/을 조사하고 싶을 수 있습니다. 그러나 나는 로거가 잘되어야한다고 생각한다. 나는 사람들이 과도한 양의 디버그 문을 출력하지 않는 한 로깅 프레임 워크가 앱 속도를 늦추는 것에 대해 불평하는 것을 듣지 않는다.

3

, 내가 사용 Java Chronicle (내가 쓴 대부분 때문에)는 100K를 지원할 수 - 초당 1M 문자 메시지를 GC에 덜 방법. 잠금 장치로 랩핑하여 스레드를 안전하게 만들 수 있습니다. 저수준이기 때문에 다른 로거만큼 사용하기 쉽지는 않지만 내가 아는 가장 빠른 것입니다.

바이너리 로깅을 사용하면 초당 10M 메시지 이상을 지원할 수 있습니다. 나는 Java Chronicle 2.0을 3 배 빠르게 개발 중이다.

무제한 대기열은 일반적으로 나쁜 것입니다. 바운드 대기열이 당신을위한 옵션이 아니라면 설계 문제가있을 수 있습니다. 무제한적인 기능이 정말로 필요한 경우 Java Chronicle은 다른 라이브러리가 실제로이를 효율적으로 지원하지 않기 때문에 유일한 옵션 일 수 있습니다. Log4j 2.0은 바운드 링 버퍼를 사용합니다.

+0

Peter 안녕하세요, 문자 메시지를 기록으로 쓸 수있는 예가 있습니까? 내가 찾을 수있는 모든 예제는 바이너리 데이터를 작성하기위한 것이다. – CaptainHastings

+0

@CaptainHastings IndexedChronicleTest.testParseLines() 및 TestManyUpdatesMain. ByteStringAppender를 살펴보십시오. –

+1

많은 감사와 BTW Chronicle이 피 묻은 멋진 게임입니다! – CaptainHastings

1

log4j에 대해 생각하지 마십시오.주십시오.

Logback은 log4j에 떨어져 잎 곳 따기 인기의 log4j 프로젝트의 후계자로 구성되어 logback을위한 이동합니다. Logback의 아키텍처는 다른 상황에서 적용하기에 충분히 일반적입니다. 현재 로그백은 logback-core, logback-classic 및 logback-access의 세 가지 모듈로 나뉩니다.

Logback에는 이미 out-of-the-box가있는 appender가 있습니다. 비동기 AsyncAppender 로그 ILoggingEvents

AsyncAppender이라고합니다. 이벤트 디스패처로만 작동하므로 유용한 기능을 수행하려면 다른 appender를 참조해야합니다.

LOSSY BY DEFAULT 80 % FULL AsyncAppender가 BlockingQueue의 이벤트를 버퍼링하는 경우. AsyncAppender로 작성된 작업자 스레드는 대기열의 헤드에서 이벤트를 가져와 AsyncAppender에 첨부 된 단일 appender에 이벤트를 전달합니다. 기본적으로 AsyncAppender는 큐가 80 % 찼을 경우 TRACE, DEBUG 및 INFO 이벤트를 삭제합니다. 이 전략은 이벤트 손실 비용으로 성능에 놀랄만큼 좋은 영향을 미칩니다.

관련 문제