[java] SLF4J / Logback에서 마커 사용에 대한 모범 사례

우리는 현재 프로젝트에서 SLF4J + Logback 조합을 사용하고 있으며 매우 행복하지만 로깅 클래스는 간단한 클래스 기반 로거를 사용하고 MDC 또는 마커와 같은 멋진 물건을 사용하지 않는 매우 간단합니다.

내가 알고 싶은 것은 커뮤니티의 누군가가 실제로 이러한 기능을 사용하는지와 로깅 / 필터링을 개선하는 데 어떻게 사용되는지입니다.

내가 특별히 어디에, 왜, 어떻게에 관심이 것 하나 개를 사용 [1] 로깅을위한 마커. 그것들은 로깅에 시맨틱 컨텍스트를 추가하는 매우 깔끔한 기능으로 저를 공격합니다. 예를 들어, 클래스가 여러 가지 문제를 처리 할 수 ​​있지만 작업 / 관심 특정 마커를 사용하여 로그 문을 구별 할 수 있습니다.

로깅에서 마커를 만들고 사용하기위한 모범 사례, 규칙 또는 전략은 무엇입니까?

업데이트 : 나는 내가 정말 후 생각하는 것은 너무하지, 생각 하는 이유 마커를 사용하려면, 오히려 어떻게 부분 – 예를 들어, 공백이나 대시 / 밑줄 / 문장 부호 컬럼 식별자가 키워드 스타일의 이름을 가진 일반 텍스트를 사용하여 (이름 마커의 좋은 사례가있다 ), 비즈니스 기능에 따라 이름을 지정하는 일종의 “표준 이름”풀이 있어야합니다. 내가 알아낼 수있는 질문이지만,이 기능을 체계적으로 사용하고 개발자 팀에 소개하려면 공식화 할 수있는 지침을 마련하는 것이 좋습니다 …


[1] – 마커 사용 방법을 묻음으로써 API 사용 방법을 묻지 않습니다 (정말 간단합니다)-마커를 일관되게 사용하여 로깅을 설정하는 방법의보다 일반적인 수준을 언급하고 있습니다.



답변

먼저 @darioo가 말했듯이 :

  • MDC는 여러 엔터티를 “엔티티”와 연결하는 데 사용됩니다.
  • [마커]는 일반적인 이벤트에서 필터링하려는 “특별한”이벤트에 사용됩니다.

따라서 MDC를 사용하려는 주장. 마커는 “슬라이스”가 아닌 “특별한”이벤트를 필터링하고 필터링합니다. 예를 들어 특정 사용자를 기준으로 슬라이스하지만 예상치 않은 예외를 기준으로 필터링 할 수 있습니다. 이 경우 User MDC 차원과 UnexpectedException Marker를 작성합니다.


그러나 이것은 분명히 당신이 생각했던 질문을 다루지 않습니다. “마커를 사용하여 일관되게 로깅을 설정하는 방법의보다 일반적인 수준을 언급하고 있습니다.” 따라서 다음과 같이 다루겠습니다.

MDC는 슬라이싱과 다이 싱 을위한 것이고 마커는 필터링을 위한 것 입니다. 이러한 활동은 테스트 및 생산 중에 수행됩니다 . 따라서 테스트 / 생산시 로그 데이터를 분할하는 데 유용 할 것으로 예상되는 차원과 필터링 할 때 유용한 차원을 결정해야합니다. 각 차원은 MDC 차원을 갖습니다. 각 사례는 마커를받습니다. 그렇게 간단합니다.

개발자는 여기서 결정을 내릴 필요가 없습니다. 한 사람 또는 팀이 디자인 타임 에 어떤 종류의 슬라이싱, 다이 싱 및 필터링을 지원 해야하는지 결정 해야합니다. 이것은 어떤 종류의 분석 작업을 수행해야하는지 상상함으로써 알 수 있습니다.

동일한 사람이나 팀이 명명 규칙을 결정해야합니다. 그것은 전적으로 임의적 입니다. 심미적으로 기쁘고 자기 묘사 적 (가장 중요한)이며 추후 추가와 충돌하지 않을 정도로 구체적인 것을 선택하십시오 . 하이픈 밑줄은 매우 까다 롭고 놀랍게도 포인트 옆에 있지만 ESL 직원이 밑줄을 읽는 것이 혼란스럽지 않을 수 있습니다 (적어도 CamelCase와 비교). 동시에, 이것은 필수 키에 도달하는 어색함 때문에 일부 개발자를 성가 시게합니다.

정책을 결정하는 한, 이는 주어진 마커 또는 MDC 차원을 채택해야하는 경우를 정의하는 것을 의미 합니다 . 이를 엄격하게 (중앙 집중식으로) 유지하지만, 개발자가 치수 및 마커 세트가 현재 작업에 충분하지 않다고 느낄 경우 피드백을받을 수 있습니다. 치수 및 / 또는 특성을 적절하게 수정 / 추가하십시오.

이 정책은 프로젝트마다 거의 다를 것임을 이해 하십시오 . 모든 프로젝트에 동일한 종류의 로깅 분석이 필요한 것은 아닙니다. 악몽의 시나리오를 그려보십시오. 그런 다음 해당 시나리오에서 로그를 분석 할 수있는 방법을 상상해보십시오. 어떤 메시지가 어떤 컨텍스트에 속하는지, 어떤 상태가 어느 시점에 있는지 추적하기 위해 복잡한 스크립트를 작성하고 싶지 않을 것입니다. 치수 및 마커로 필요한 정보를 인코딩하고 문제가 발생하면 번거 로움을 덜어줍니다.


답변

먼저 MDC.

MDC는 일부 동작과 관련된 하나의 “엔티티”가있는 환경에서 실제로 유용합니다. 일반적인 예 : 사용자가 웹 응용 프로그램과 상호 작용합니다. 많은 웹 사용자가 웹 앱을 사용하고 있다고 가정 해 보겠습니다. MDC를 사용하면 번거 로움없이 쉽게 추적 할 수 있습니다. 단순화 된 예 :

...[Sandy][abcd] clicked on "change profile"
...[Joe][1234] clicked on "weather reports"
...[Joe][1234] clicked on "Europe"
...[Sandy][abcd] clicked on "logout"
...[Joe][1234] clicked on "logout"
...[Sandy][efgh] logged in

여기서는 사용자 이름과 세션 ID의 두 위치에서 MDC를 사용하고 있습니다. 이런 식으로 한 사용자의 세션을 쉽게 파악하여 모든 작업을 볼 수 있습니다.

둘째, 마커.

마커는 일반적으로 심각한 오류가 발생할 경우 관리자에게 이메일을 보내는 것과 같은 “특별한”상황에 사용됩니다. 모든 오류가 항상 같은 범주에 속하는 것은 아닙니다. 일부는 적절한 방식으로 처리해야합니다.

또는 사용자가 서비스를 종료하면 일반적으로 INFO 로그로 이동하지만 이와 같은 이벤트를 별도의 로그 파일로 보내려면 해당 인스턴스에 대한 마커를 사용할 수도 있습니다. 사용자의 통계 수집을 위해 더 쉽게 종료합니다.

경험 법칙 :

  • MDC는 여러 엔터티를 “엔티티”와 연결하는 데 사용됩니다.
  • 마커는 일반적인 이벤트에서 필터링하려는 “특별한”이벤트에 사용됩니다.

답변

마커를 사용하여 단일 로그 문 을 채색 하거나 표시 할 수 있습니다 . 이러한 색상, 즉 마커로 수행하는 작업은 전적으로 귀하에게 달려 있습니다. 그러나 두 가지 패턴이 마커 사용에 공통적 인 것으로 보입니다 (첫 번째 패턴이 두 번째 패턴보다 일반적입니다).

  1. 트리거링 : 일부 어 펜더는 특정 마커가있을 때 조치를 취하도록 지시 할 수 있습니다. 예를 들어, 로그 수준에 관계없이 SMTPAppender로깅 이벤트에 NOTIFY_ADMIN마커 가 표시 될 때마다 이메일을 보내도록 구성 할 수 있습니다 . 로그 백 문서에서 마커 기반 트리거링 을 참조하십시오 . 트리거를 위해 로그 수준과 마커를 결합 할 수도 있습니다.

  2. 필터링 : 예를 들어 “DB”라는 색상으로 모든 지속성 관련 로그 (다양한 클래스 파일 또는 여러 클래스 파일로)를 색상 / 표시 할 수 있습니다. 그런 다음 “DB”를 필터링 할 수 있습니다. DB로 표시된 로그 문을 제외하고 로깅을 비활성화하십시오. 자세한 내용은 로그 백 설명서 에서 필터 관련 장 을 참조하십시오 (MarkerFilter 검색).


답변

부록과 마찬가지로 logstash를 사용하고 json 로깅을 활성화 한 경우 특정 로그 메시지와 연관시키기 위해 변수를 로깅하기 위해 Marker를 사용할 수 있습니다. 이것은 메시지 본문에 포함하는 것보다 일관되고 구문 분석이 더 쉽습니다. 사용 사례에 적합한 경우 매우 유용합니다.

자세한 내용은 여기를 참조하십시오.

https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event


답변