오류 로깅이 실패하면 어떻게합니까? 생산에서 작동하는 것을 어떻게 테스트합니까?
-
22-08-2019 - |
문제
- 오류 로깅 코드가 실패하면 어떻게합니까?
- 현재 작동하는지 확인하려면 어떻게해야합니까?
- 작동하지 않는지 어떻게 알 수 있습니까?
- 생산 환경에서 작동한다는 것을 어떻게 테스트합니까?
- 다른 모든 것이 실패하면 예외를 던져야합니까?
아래 코드는 Microsoft의 엔터프라이즈 라이브러리 로깅 응용 프로그램 블록을 사용합니다. 어떻게 "더 나은"만드는가?
using Microsoft.Practices.EnterpriseLibrary.Logging;
class Program
{
static void Main(string[] args)
{
try
{
// Trying to write some data to the DB
...
}
catch (Exception ex)
{
LogHelper.LogException(ex, "Trying to write to the DB");
}
}
}
public class LogHelper
{
public static void LogException(Exception ex, string exceptionType)
{
try
{
// Simplified version, only logging the message
Logger.Write(exceptionType);
}
catch
{
// What do you do here???
}
}
}
해결책
내 답변을 참조하십시오 관련 질문:
다른 모든 것이 실패하면 캐치 블록에 '최후의 수단 로깅'이 있습니다. 실패 할 가능성이 거의없는 위치의 텍스트 파일에 예외를 기록하십시오. 이 최후의리스트 로깅이 또 다른 예외를 던지면 실패하면 해당 예외를 삼키거나 앱을 종료하고 오류를 메시지 상자로 표시 할 수 있습니다.
이 구체적인 (예외적 인) 사례에서는 예외를 삼키는 것이 앱을 종료하지 않는 유일한 방법입니다.
다른 팁
내 앱은 일반적으로 오류로 두 가지를 수행합니다. 첫 번째는 로컬 로그 파일에 작성하는 것입니다 (일부 유형의 데이터베이스 로깅을 사용하더라도). 그런 다음 오류의 이메일을 지원을 위해 설정 한 배포 목록에 보냅니다.
따라서 데이터베이스 로그가 실패하면 오류는 여전히 로컬 로그 파일에 있으며 이메일을 통해 전송됩니다.
이메일이 실패하면 오류가 여전히 기록되어 있으므로 나중에 문제를 해결할 수 있습니다.
그보다 더 내성을 높이는 것은 매우 미션 크리티컬 응용 프로그램 인 IMHO에 대한 노력에만 가치가 있습니다.
로그 파일을 작성하고 절대 사라지지 않을 공통 주소로 이메일을 전송합니다. 방탄도 아니지만 메일 시스템이 다운되거나 이메일 서버가 변경되면 우리는 그것에 대해 알게 될 것이라고 생각합니다. 데이터베이스와 플랫 파일 모두에 쓰고 이메일을 보내는 앱이 있습니다. 그래서 3 개 중 하나가 작동합니다. 내 앱 중 하나가 로그를 위해 DB에 글을 쓰는 것임을 알았고 캐치에서 동일한 DB에 글을 쓰는 것이었고 DB 연결의 약간의 변경으로 인해 앱이 실패하는 것임을 발견 한 유일한 방법입니다. 캐치 문에서 DB 대신 이메일을 수행하는 것을 수정했습니다. 플랫 파일에서 가지고있는 유일한 문제는 파일 시스템 저장소입니다. 로그 용 플랫 파일을 작성하는 많은 응용 프로그램이있어서 지속적으로 백업하고 저장하거나 평범한 삭제를합니다.