SLF4J/로그백에서 마커를 사용하는 경우의 베스트프랙티스
현재 프로젝트에서는 SLF4J+Logback 조합을 사용하고 있어 만족하고 있습니다만, 로그 전략은 매우 간단합니다.직접 클래스 베이스의 로거를 사용하고, MDC나 Markers등의 화려한 것은 사용하지 않습니다.
제가 알고 싶은 것은 커뮤니티에서 실제로 이러한 기능을 사용하는 사람이 있는지 여부 및 로깅/필터링 개선에 어떻게 사용되는지입니다.
특히[1] 로깅에 마커를 사용하는 장소, 이유 및 방법에 관심이 있습니다.로깅에 의미적 문맥을 추가하기 위한 매우 깔끔한 기능이라는 인상을 준다.예를 들어 클래스가 여러 개의 문제를 처리하는 동안 로그 문을 구별하기 위해 태스크/관련 특정 마커를 사용할 수 있다.
로깅에서 마커를 만들고 사용하기 위한 베스트 프랙티스, 규칙 또는 전략은 무엇입니까?
업데이트: 제가 정말로 원하는 것은 마커를 사용하는 이유라기보다는 마커를 지정하는 방법(예를 들어 공백이 있는 일반 텍스트 또는 대시/밑줄/문장으로 구분된 키워드 스타일 이름 등)입니다.비즈니스 기능에 따라 이름을 붙이는 "표준 이름"의 풀이 있는 경우입니다.질문은 아마 스스로 해결할 수 있을 것입니다만, 이러한 기능을 체계적으로 사용해 개발 팀에 소개하고 싶다면, 몇개의 가이드 라인이 있는 것이 타당합니다.
[1] -마커 사용법을 묻는 것은 API 사용법을 묻는 것이 아니라 (정말 간단하다) -마커를 사용하여 로그아웃을 일관되게 설정하는 방법에 대한 보다 일반적인 수준을 말하는 것입니다.
먼저 @darioo가 말했듯이:
- MDC는 '엔티티'가 적은 여러 이벤트를 연관짓기 위해 사용됩니다.
- [Markers]는 일반적인 이벤트에서 필터링하려는 "특수" 이벤트에 사용됩니다.
그래서 당신은 이것에 MDC를 사용하고 싶다고 하는 당신의 주장.마커는 "슬라이싱"이 아니라 "특수" 이벤트를 강조 표시하기 위한 것입니다.예를 들어 특정 사용자를 기준으로 슬라이스하지만 예기치 않은 예외에 따라 필터링할 수 있습니다.이 경우 사용자 MDC 차원과 예기치 않은 값을 만듭니다.예외 마커
하지만 이건 당신이 생각하고 있던 질문에 대한 답이 아닌 것 같군요.이는 "마커를 사용하여 지속적으로 로깅을 설정하는 방법에 대한 보다 일반적인 수준"을 의미합니다.이 점에 대해 설명하겠습니다.
MDC는 슬라이스 및 다이싱용이고 마커는 필터링용입니다.이러한 활동은 테스트 및 생산 중에 수행됩니다.따라서 로그 데이터를 슬라이스하는 데 도움이 될 것으로 예상되는 치수와 테스트/실가동 시 로그 데이터를 필터링하는 데 도움이 될 수 있는 경우를 결정해야 합니다.각 치수는 MDC 치수를 취득합니다. 각 케이스에는 마커가 있습니다.그것은 저것만큼 간단합니다.
개발자는 여기서 어떤 결정도 내릴 필요가 없습니다.어떤 종류의 슬라이스, 다이싱 및 필터링을 지원해야 하는지 설계 시 개인 또는 팀이 결정해야 합니다.이는 어떤 종류의 분석 작업을 수행하도록 요청받을 수 있는지 상상함으로써 알려야 한다.
명명 규칙은 동일한 사용자 또는 팀이 결정해야 합니다.그건 완전히 제멋대로야.미적으로 즐겁고, 자기 설명적이고(가장 중요하며) 나중에 추가된 내용과 충돌하지 않을 만큼 구체적인 내용을 선택하십시오.하이픈 대 밑줄은 매우 까다롭고 놀라울 정도로 요점을 벗어났지만 ESL 직원이 (적어도 Camel Case에 비해) 밑줄을 읽는 것은 덜 혼란스러울 수 있습니다.동시에, 이것은 필요한 키에 도달하는 것이 불편하기 때문에, 일부의 개발자를 곤란하게 합니다.
정책을 결정하는 한, 이는 특정 Marker 또는 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
여기서는 MDC를 사용자 이름과 세션 ID의 두 곳에서 사용하고 있습니다.이렇게 하면 한 사용자의 세션을 쉽게 grep하여 사용자가 수행한 모든 작업을 볼 수 있습니다.
두 번째, 마커.
마커는 일반적으로 심각한 오류에 대해 관리자에게 이메일을 보내는 등 "특수한" 상황에서 사용됩니다.모든 오류가 항상 같은 범주에 속하는 것은 아닙니다. 일부 오류는 적절한 방법으로 처리되어야 합니다.
또는 사용자가 서비스를 종료하면 보통 INFO 로그로 이동하지만 이와 같은 이벤트를 별도의 로그 파일에 저장할 경우 마커를 사용하여 사용자가 종료하는 통계 수집을 위해 보다 쉽게 모니터링할 수 있습니다.
경험칙:
- MDC는 '엔티티'가 적은 여러 이벤트를 연관짓기 위해 사용됩니다.
- 마커는 일반 이벤트로부터 필터링하려는 "특수" 이벤트에 사용됩니다.
마커를 사용하여 단일 로그 문을 색칠하거나 표시할 수 있습니다.이 색상, 즉 마커로 무엇을 할지는 전적으로 사용자에게 달려 있습니다.그러나 마커 사용에는 두 가지 패턴이 일반적인 것 같습니다(첫 번째 패턴이 두 번째 패턴보다 더 일반적입니다).
트리거링: 일부 Appender는 특정 마커가 있는 상태에서 액션을 수행하도록 지시될 수 있습니다.예를들면,
SMTPAppender
로깅 이벤트가 로 마크될 때마다 이메일을 보내도록 설정할 수 있습니다.NOTIFY_ADMIN
로그 레벨에 관계없이 마커가 표시됩니다.로그백 설명서에서 마커 기반 트리거링을 참조하십시오.트리거를 위해 로그 레벨과 마커를 결합할 수도 있습니다.필터링:예를 들어 모든 지속성 관련 로그(다양한 클래스 파일 및 여러 클래스 파일)에 "DB" 색상을 지정하거나 표시할 수 있습니다.그런 다음 "DB"를 필터링할 수 있습니다. DB로 표시된 로그 문을 제외하고 로깅을 비활성화합니다.자세한 내용은 로그백 설명서의 필터 관련 장을 참조하십시오(MarkerFilter 검색).
부록과 마찬가지로 logstash를 사용하고 json 로깅을 활성화하면 Marker를 사용할 수 있습니다. 즉, 특정 로그 메시지와 관련짓는 로깅 변수에 사용할 수 있습니다.이것은 메시지 본문에 포함하는 것보다 더 일관되고 해석하기가 쉽습니다.사용 사례에 맞는다면 매우 유용합니다.
자세한 내용은 이쪽:
https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event
MDC의 장점은 스레드에서 정보를 얻을 수 있다는 것입니다.마지막으로 로그를 송신하는 방법을 예로 들어 보겠습니다.메서드 및 서브메서드의 호출 전체에서 프로그램 중에 수집된 정보를 MDC에 입력할 수 있습니다.로그가 마지막에 기동하면, MDC 와 거기에 격납할 수 있는 모든 정보가 포함됩니다.적절한 패턴만 있으면, MDC 로부터 정보를 취득할 수 있습니다.
반면에 마커는 로그와 직접 연결됩니다.
언급URL : https://stackoverflow.com/questions/4165558/best-practices-for-using-markers-in-slf4j-logback
'programing' 카테고리의 다른 글
PHP: 괄호 안의 텍스트를 추출하는 가장 좋은 방법? (0) | 2022.10.11 |
---|---|
Ubuntu에서 터미널에 'php'를 입력하면 오류가 많이 표시됨 (0) | 2022.10.11 |
';' 구분 기호를 사용하여 행에서 열로의 Mysql (0) | 2022.10.11 |
JavaScript에서 REST 웹 서비스 API를 호출하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
SQLite3를 MySQL로 빠르게 마이그레이션하는 방법 (0) | 2022.10.02 |