로거 실패를 어떻게 처리해야합니까?


12

회사의 여러 응용 프로그램에서 사용자 지정 로거를 사용합니다. 상당히 강력하지만 나중에 NLog와 같은 것으로 바꿀 수 있습니다. 로거의 작업 중 하나는 응용 프로그램에서 발생한 예외를 기록하는 것입니다.

내가 항상 가지고 있었던 한 가지 우려 는 로거 내 예외 처리 가 자동 실패를 허용한다는 것입니다. 즉, 로그가 주어진 예외에 대해 기록되지 않은 경우 (로거의 오류로 인해) 로그를 어떻게 처리하고 어떻게 든 로거 자체에 예외를 기록 해야합니까?

WriteLog 함수에서 예외가 발생한다고 가정 해 봅시다. 몇 번 또는 예외가 발생하지 않을 때까지 함수를 호출해야합니까? 로거로 던져진 예외를 작성해야합니까 (예외적으로 예외가 발생할 수 있습니다). 사용자 정의 로거를 처음 구현했을 때를 제외 하고는이 상황을 겪지 않을 정도로 운이 좋았습니다. 반면, 로거가 응용 프로그램 예외를 기록하지 못한 경우 (자체 예외로 인해) 알 수있는 방법이 없습니다.

온라인 및 일부 SE 사이트에서 검색을 시도했지만 모든 게시물이 로거의 오류 (잠재적 예외 및 로깅 방법은 아님) 또는 로거 외부의 예외를 처리하기 때문에 지금까지 성과가 없었습니다.



5
stderr출력 매체가 실패했거나 "불가능"이 발생했음을 로그하십시오 .
Doval

1
개발자에게 이메일을 보내거나 이메일 주소로 오류를 표시하고 사용자가 오류를 복사하여 붙여 넣을 수 있습니다.
Chloe

답변:


17

로거 자체에서 예외가 발생하면 로거를 사용하여 자체 예외를 기록해서는 안됩니다. 그 이유는 다음과 같습니다.

  • 무한 루프에 빠질 수 있습니다. 로거 내에 테스트되지 않은 조건부 분기가 있고 예외를 생성한다고 가정하십시오. 조건이 충족되면 더 이상보고 된 예외가 동일한 분기에서 처리된다고 상상해보십시오. 이것은 분기가 실행되는 순간부터 무한 루프 상태임을 의미합니다.

  • 초당 수천 개의 예외가 발생하여 일시적인 루프에 빠질 수 있습니다. 원격 서버에 예외를보고한다고 상상해보십시오. 서버 문제로 인해 연결이 다시 연결될 때까지 다른 예외가 발생하는 등 다른 예외가 발생합니다.

대신해야 할 일은 예외를 기록하는보다 안전한 방법으로 대체하는 것입니다. 예를 들어, 로거가 예외를 원격 서버로 보내는 경우 로거 내의 예외를 syslog대신 보내십시오 . 로거가 Windows 이벤트에 예외를 기록하고이 조치가 실패하면 실패 예외를 간단한 텍스트 파일에 저장하십시오.

일단 그런 다음에, 다음 질문은 그러한 예외가 어떻게 발생했는지 어떻게 알 수 있는가하는 것입니다. 수천 대의 서버에서 수십 개의 응용 프로그램을 실행하는 경우 정기적으로 각 응용 프로그램을 SSH하여 로컬로 로깅하고 있는지 확인할 수는 없습니다. .

한 가지 방법은 "예외 로그"를 확인하고 다른 예외가 저장되는 위치로 푸시하는 크론 작업을하는 것입니다 (결과적으로 로거를 사용하지만 무한 또는 임시 루프를 조심하십시오!).


이메일로 보낸 예외 로거에서 이와 동일한 문제가 발생했습니다. 서버에 연결하지 못하면 끔찍한 무한 루프에 빠졌습니다. 대신, 나는 이벤트 로그로 전환하고 새로운 연결이 이루어질 때까지 새로운 이메일이 발송되는 것을 막기 위해 점검을 실시했습니다.
mgw854

우리는 제안대로 폴백을 구현하려고 노력할 것입니다. 응용 프로그램을 중지하라는 Jon Raynor의 제안 (중요한 로깅 상황에서)은 우리가 고려하지 않았을 수도 있습니다.
Zairja

파일에 syslog 또는 I / O 오류를 보내는 시간 초과가 발생하면 어떻게됩니까? 네트워크 혼잡 또는 디스크 공간 부족으로 인해 오류가 발생한 경우 여전히 문제를 악화시킬 수 있습니다. 이것은 전체적인 솔루션이 아닙니다. 오류를 기록하는 안전한 방법이 없을 가능성을 고려해야합니다. 그것은 위험한만큼 당신이주기를 감지, 지수 백 오프 등 통합으로 자신의 로거에 기록하는 것이 아니다
Aaronaught

11

로깅이 애플리케이션에 중요한 경우 로깅에 실패하면 애플리케이션을 중지해야합니다.

중요하지 않은 경우 다소 방어적인 구성 요소는 보조 소스에 로깅 / 경고하는 로깅 오류를 처리하기위한 보조 구성 요소를 가질 수 있습니다. 그러나 그조차도 확실한 증거는 아니며 보조 로거가 기본 로거를 모니터링하는 동안 실패하면 어떻게되는지 고려해야합니다.

좋은 전략은 로컬 파일에 로깅하는 것입니다. 실패하면 이벤트 로그에 실패를 기록하고 전자 메일 경고를 생성하며 데이터베이스에 저장하는 등의 작업을 수행 할 수 있습니다. 사용 가능한 로깅 프레임 워크를 사용하면 시스템이 실행되지 않는 한이를 방지해야합니다. 디스크 공간 부족 또는 기타 드문 조건.

이상적으로는 응용 프로그램의 복잡성이 줄어들 기 때문에 자동으로 실패하는 것이 좋습니다.

더 중요한 것은 로깅 실패를 처리하기 위해 타사의 로그를 모니터링하는 것입니다. 시간이 지남에 따라 건강 응용 프로그램이 기록하는 이벤트 수를 식별 할 수 있어야합니다. 이벤트가 낮거나 로깅을 시작하지 않으면 모니터링을 통해 문제가 발생하는 것을 확인할 수 있으며 타사 메커니즘을 통해 잠재적으로 경고 할 수 있습니다.


1
중요 로깅과 중요하지 않은 로깅을 구분하고 시간 경과 당 로그 수의 중요성을 지적하면 +1입니다. 몇 년 동안 폴백 로깅을 사용하는 동안 이러한 두 가지 측면에 대해 생각하지 않은 것에 실망했습니다.
Arseni Mourzenko 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.