2017-03-23 2 views
1

나는 모든 Akka 액터의 클러스터를 가지고 있으며 모두 로거로 사용됩니다. 순수한 Akka 배우의 시작에서, 내가 응용 프로그램을 초기화하는 동안이 작업을 수행 할 수 있습니다재생 프레임 워크 로거에 글로벌 사용자 정의 값 추가

MDC.put("role", role) 

역할 ("노동자"와 같은) 과정의 주요 역할을 나타내는 문자열되고, 모든 기록이 추가 컨텍스트 값을 가질 것이다, 수사를 돕는다.

역할 중 하나는 프론트 엔드이며 Play 프레임 워크를 사용하여 REST API를 게시합니다. 이 경우 앱을 확장하는 객체를 정의하지 않고 전역 값을 설정하는 방법 및 위치를 모르기 때문에 재생 응용 프로그램에서 생성되는 모든 로그에 역할 (및 기타 원하는 추가 항목이 표시됩니다. 놓다).

답변

1

재생은 멀티 스레드 응용 프로그램이므로 MDC를 사용하면 효과적으로 작동하지 않습니다. 가장 좋은 방법은 스레드간에 전달할 수있는 SLF4J 마커 API를 사용하는 것입니다.

Play 2.6.x는 the Marker API directly을 지원하지만, SLF4J를 직접 사용하여 Logstash Logback Encoder을 활용하여 역할 및 기타 정보가 포함 된 풍부한 마커를 만들어야합니다.

import static net.logstash.logback.marker.Markers.* 

Marker logstashMarker = append("name", "value"); 
private val logger = org.slf4j.LoggerFactory.getLogger(this.getClass) 
logger.debug(logstashMarker, "My message") 

그런 다음 스레드 로컬 정보에 대한 걱정없이 logstashMarker를 암시 적 매개 변수로 메소드에 전달할 수 있습니다.

Play는 요청을 처리하므로 Play에서 원하는 Akka의 모든 "글로벌"정보를 추출하고 추가해야합니다. 최대한의 편의를 위해 작업 구성을 사용하여 WrappedRequest에 정보를 넣거나 필터를 추가합니다.

+0

고마워요! 내 이해는 아래의 시스템 (예를 들어 Akka)에 기록 된 로그에는 절대로이 마커가 없다는 것입니다. – CanardMoussant

+0

akka.event.Logging을 사용하는 경우 2.4.x에서 마커 지원을 사용할 수 없습니다. 2.5.0에서 사용할 수 있어야합니다. https://github.com/akka/akka/issues/21671을 참조하십시오. –

관련 문제