2010-04-04 5 views
5
try 
{ 
    // Code 
} 
catch (Exception ex) 
{ 
    Logger.Log("Message", ex); 
    throw; 
} 

라이브러리의 경우에도 예외를 로그해야합니까? 방금 던져서 응용 프로그램이 기록하도록 허용해야합니까? 내 관심사는 라이브러리에 예외를 기록하면 많은 중복이 생길 수 있다는 것입니다 (라이브러리 레이어가 로그 할 것이고 응용 프로그램 계층이 로그에 기록 할 것이고 아무 것도 기록하지 않기 때문에).하지만 로그에 기록하지 않으면 라이브러리를 사용하면 버그를 추적하기가 어려울 수 있습니다. 이에 대한 모범 사례가 있습니까?예외를 기록하는시기는 언제입니까?

답변

3

나는 아무것도하지 않을 것이라는 예외를 기록하지 않을 것입니다. 예를 들어 예외 처리기를 통과하는 것뿐입니다. 이미 언급했듯이, 이것은 많은 도움이되지 않는 잡음을 추가합니다. 실제로 라이브러리에 대해 무언가를하고있는 시점, 또는 라이브러리의 경우 사용자 코드로 넘어가는 경계에서 로그하는 것이 더 좋습니다.

그렇다고해서 예외를 발생시키는 시점과 예외를 유발 한 시점에서 항상 로그에 기록하려고합니다. 이것은 예외의 이유를 밝히는 데 훨씬 더 유용합니다. 게다가, 당신이 만나는 조건이 예외를 던져 버릴만큼 나쁘다면, 나는 또한 '왜'를 로그 아웃하는 프로세서 시간을 보내야한다고 말할 것이다.

1

응용 프로그램이 로그에 기록 할 수 있도록 기록한 후 던져야합니다. 특히 그것의 도서관, 당신은 안되 어플 리케이션은 확실히 그것을 기록 할 것이라고 (당신이 그것을 기록해야한다!).

2

로깅을 최고 수준의 클라이언트에 맡기는 편이 좋으며, 클라이언트가 실행 중일 때 라이브러리에 오류/출력을 기록해야하는 라이브러리에 TextWriter를 제공하여 로깅을 활성화/비활성화 할 수 있습니다. 일반 로그에 쓸 수있는 권한이없는 환경에서 실행됩니다.

상위 수준에서 기록하는 것을 선호하는 이유는 상위 수준이 더 많은 상황 정보를 갖고 있으며 이러한 오류를보고/기록하는 더 적절한 방법을 알 수 있기 때문입니다. 요즘은 예외적으로 모든 스택 추적 정보가 포함되어 있기 때문에 예외가 발생하면 즉시 로깅하여 많은 이득을 얻을 것이라고 생각하지 않습니다. 그렇지만 다른 종류의 예외로 변환되는 예외에 대해서는 신중해야합니다. 따라서 처리되는 동안 예외를 변환하는 경우 InnerException을 사용하여 오류 소스에 대한 모든 정보를 유지해야합니다.

편집 : 물론이 철학은 다른 철학이 따르는 환경에서만 작동합니다. 예외는 무시하지 마십시오. 클라이언트 또는 일부 중간 계층에서 예외를 throw하는 경우 다른 문제가 발생하며 클라이언트가 무책임하더라도 생성되는 일부 출력에 예외 로그를 ​​기본적으로 설정해야합니다.

1

로그 예외는 응용 프로그램을 디버깅하는 방법이 될 수도 있습니다.

1

log4net을 사용하십시오. 진지하게.

표준 및 유비쿼터스 라이브러리를 사용하면이 문제에 대해 오랫동안 생각한 사람들로부터 지침을 얻을 수 있습니다. 해결책은 대부분의 로깅 라이브러리에 여러 수준의 로깅이 있다는 것입니다.

예를 들어 log4net에서 나는 응용 프로그램 관리자는 다음 그가보고에 관심이 있음을 로그인 서로 다른 레벨을 설정할 수 있습니다

ILog log = LogManager.GetLogger("some logger"); 
log.Debug("some debugging info"); 
log.Info("some message meaningful in the domain"); 
log.Warn("something might be occurring that merits your attention"); 
log.Error("Everything just went to hell") 

할 수 있습니다. 런타임에이 구성을 변경할 수도 있습니다.사실, log4net과 같은 강력한 로깅 라이브러리를 사용하면 서로 다른 소스의 로깅 수준을 다른 어 펜더로 보낼 수 있습니다. 예를 들어, 하드 디스크에 저장되어있는 지난주의 모든 로깅 메시지, 데이터 액세스 레이어에서 시작되지 않은 모든 정보, 경고 및 오류 메시지를 데이터베이스로 푸시 한 롤링 파일과 모든 오류를 보낼 수 있습니다 이메일을 통해 당신에게.

당신이 "디버그"로그 수준에서 꽤 명확하게 설명하는 것 같아요.

물론 로깅 수준을 구현할 수도 있지만 라이브러리를 사용하는 모든 사람이 모든 디버깅 정보를보고 싶다면 사용중인 시스템뿐 아니라 시스템도 알아야합니다. 표준화하는 것이 더 낫습니다.

그래서 모범 사례 :

  1. 를 사용하여 서로 다른 로깅 수준.
  2. 로깅 프레임 워크를 롤하지 마십시오. log4net (실제로는이 날과 그 시대의 표준입니다) 또는 적어도 Microsoft의 entlib logging block을 사용하십시오.
관련 문제