2017-04-06 10 views
3

요청 및 응답을 웹 서비스에 기록하려고합니다. 나는 기본 log4j2 구현과 함께 slf4j를 사용하고있다. 로거 명세서는 다음과 같습니다.slf4j-log4j는 Asynchronus logger로 전달하기 전에 객체를 string으로 변환합니다.

LOGGER.info ("{}", 새 CustomObject (요청, 응답, param1, param2));

필자는 모든 필요한 개체와 해당 개체의 모든 특성을 기록하기 위해 CustomObject 클래스에서 toString 메서드를 구현했습니다.

CustomObject의 toString 메서드가 로그 메시지를 Asynch 로거에 전달하기 전에 호출되는 것을 볼 수 있습니다.

어쨌든 실제 로깅을 수행 할 때 사용자 지정 개체의 serialization/toString 메서드 호출이 연기 될 수 있습니까?

+0

내 대답을 허용 했습니까/유용합니까? –

답변

3

이것은 의도적으로 설계된 것입니다. 개체가 기록되는 경우 배경 스레드가 기록하기 전에 개체가 변경 될 수 있으며 사용자가 의도 한 것과 다른 로그 항목이 생길 수 있습니다.

예에서 응용 프로그램은 CustomObject에 대한 참조를 보유하지 않으므로 변경할 수는 없지만 Log4j2는이를 알 수 없기 때문에 보수적 인 접근 방식을 취합니다.

이를 전환 할 system property 있습니다 만, 사용이 모든 객체가 효과적으로 불변해야합니다 로그인 또는 나는 것이 100 % 확실 해요 (... 당신의 로그가 당신에게 거짓말을 찾을 것을 의미합니다 Log4j2가 버전 2.6에서 가비지가 없어 졌기 때문에 시스템 속성이 여전히 작동합니다.

업데이트 (2017-12-09) : 시스템 등록 정보는 여전히 2.6 이후 버전에서 작동합니다. (그러나 응용 프로그램이 기록 된 개체를 수정하지 않는다는 확신이 없으면 백그라운드 스레드에서 메시지를 렌더링하는 것을 권장하지 않습니다.)

+0

감사합니다. 이 log4j.format.msg.async를 true로 설정 한 후 toString 메소드가 호출되지 않았습니다. 객체 속성이 주 스레드에서 변경되면 로깅에서 토스 (toss)로 이동한다는 것은 사실입니다. 그러나, 나의 유스 케이스를 위해, 이것은 작동한다. –

+0

대답이 유용하다면 받아 들일 수 있습니까? –

+0

시스템에 다른 로거가 정의되어있는 경우 해당 로거에도 적용 할 수 있습니다. 그리고 그 시점에서 우리는 변경 가능한 객체를 로깅하는 것에주의해야합니다. –