2009-05-19 5 views
3

도와 주시면 감사하겠습니다.Log4J로 구조화/결합 로깅

트랜잭션을 기록해야하는 웹 서비스가 있습니다. 히트 수가 많으므로 로그 문은 로그 파일에서 분리되거나 조각납니다.

레이어를 통해 StringBuilder 인스턴스를 전달하고이 인스턴스에 문을 추가 한 다음 클라이언트에 응답을 반환하기 전에 내용을 맨 끝 (주 컨트롤러의 finally 절)에 한 번 기록합니다. . 이것은 불필요한 것으로 보이며 Log4J로는 더 깨끗한 방법이 있다고 확신합니다.

누구든지 문제를 밝힐 수 있습니까? 당신은 주위의 문제를 돌려 고려해 볼 수 있습니다

감사

답변

8

좋은 점은 Log4j를 사용하고 있다는 것입니다. 라이브러리 자체에 중첩 진단 컨텍스트 (org.apache.log4j.NDC) 및 매핑 된 진단 컨텍스트 (org.apache.log4j.MDC)의 개념이 구현되었습니다. 나는 당신이 당신이 당신의 로그 아웃풋 레이아웃에서 사용할 수있는 일종의 컨텍스트를 구축 할 수 있기 때문에 두 가지를 모두 봐야한다고 생각한다. 대신 통해 아웃 꽤 어색 API (추가 메서드 매개 변수)로 이어질 수있는 층, StringBuilder 내 인스턴스를 전달

+0

+1. 이것은 MDC가 해결하도록 설계된 것입니다. 잘 작동한다. –

+0

감사합니다. MDC와 분석기를 사용하여 로그 출력을 이해하고 있습니다. – opyate

1

는 : 대신 런타임에 로그 항목의 모든 조각을 통합의, 데이터의 분석 중에 나중에 통합.

예를 들어 우리는 빠른 응답이 중요한 많은 데이터를 기록하는 응용 프로그램을 보유하고 있습니다. 우리는 최근 관계형 데이타베이스에 로그를 남기는 맞춤형 시스템을 구현했습니다. 그러나 로깅 부분은 로깅을 위해 최적화되어 있습니다. 튜플 데이터를 응용 프로그램이 생성하는 순서대로 로그 파일에 추가하기 만하면됩니다. 우리는이 형식에 대해 쿼리를 수행 할 수있는 도구를 갖추고 있으며 로그 형식에 대한 모든 쿼리가 데이터베이스의 모든 테이블에 대한 테이블 검색을 효과적으로 필요로한다는 것을 짜증나게 할 때 다른 형식으로 저장된 새 버전의 데이터베이스를 생성 할 계획입니다.

이 기술을 직접 사용할 수 없더라도 Log4J에서 더 나은 기능을 수행하기위한 아이디어를 얻을 수 있습니다.

+0

감사합니다. 또한 % t를 사용하여 다른 스레드를 구별합니다. 속도가 최우선입니다. – opyate

0

우리는 과거와 비슷한 것을 해결해야했습니다. Message (예 : 사용자 트랜잭션 ID) 및 사용자 정의 appender 클래스에 대한 메타 데이터도 포함하는 enveloped message 객체를 만들었습니다. 이 appender 클래스에서 우리는 단순히 toString (일반 appender에 대한 좋은 로그를 반환해야 함)을 호출하는 대신 envelope에서 메타 데이터를 가져 오기 위해 instanceof 문을 사용합니다.

또는 SLF4J를 사용하는 것이 좋습니다. 로그 메시지가있는 Marker 객체를 전달하는 표준 기능이 있습니다. 예 : 그들의 debug(Marker marker, String msg) 메소드 과부하에 대해서는 Javadoc을 참조하십시오.

0

한 번 더 생각, 당신은에 덤프 할 수있는 현재 컨텍스트를 개최 java.lang.ThreadLocal 사용을 고려할 수 맨 끝의 로그.

1

모든 로그 문을 가지고 있어야 로그에 기록된다는 의미입니다. 순서를 변경하면 까다로운 버그를 추적해야하는 일부 이벤트의 시퀀스를 놓칠 수 있습니다.

요청을 보낸 스레드 ID 또는 사용자 ID로 시작하는 것처럼 식별자를 메시지에 추가 할 수 없습니까? 이렇게하면 grep과 같은 것을 사용하여 로그에서 쿼리를 실행할 수 있습니다.

grep userId *.log 

이 명령문은 해당 사용자의 모든 로그 명령문을 올바른 순서와 속도로 반환합니다.

우리는 고 처리량 거래 플랫폼에서이 기술을 사용하며 로그 파일의 시스템을 통해 거래 또는 사용자 요청을 따르는 가장 쉬운 방법입니다. 자체 로거를 확장하거나 작성하지 않아도됩니다.