현재 멀티 레이어 아키텍처로 큰 하위 시스템을 리팩토링하고 있으며 효과적인 오류 로깅 처리 전략을 설계하는 데 어려움을 겪고 있습니다.
내 아키텍처가 다음 3 가지 레이어로 구성되어 있다고 가정 해 보겠습니다.
- 공용 인터페이스 (IE MVC 컨트롤러)
- 도메인 레이어
- 데이터 액세스 계층
혼란의 근원은 오류 로깅 처리를 구현 해야하는 곳입니다.
가장 쉬운 해결책은 최상위 수준에서 로깅을 구현하는 것입니다 (즉, 공용 인터페이스 \ MVC 컨트롤러). 그러나 이것은 다른 계층을 통해 예외를 버블 링 한 다음 로깅하는 것을 의미하기 때문에 잘못 느낍니다. 소스에서 예외를 기록하는 대신.
정보가 가장 많기 때문에 소스에서 예외를 기록하는 것이 가장 좋습니다. 이것에 대한 내 문제는 모든 예외를 포착하지 않고 소스에서 모든 예외를 포착 할 수 없다는 것입니다. 도메인 / 공용 인터페이스 계층에서는 아래 계층에서 이미 포착, 기록 및 다시 throw 된 예외를 포착하게됩니다. .
또 다른 가능한 전략은 # 1과 # 2의 혼합입니다. 이를 통해 레이어에서 특정 예외를 포착하고 (즉
SqlExceptions
, 데이터 액세스 계층에서 캐치, 로깅 및 다시 던지기 ) 가장 많이 포착되지 않은 예외를 최상위 레벨에 기록합니다. 그러나 이미 처리 된 오류와 그렇지 않은 오류를 구별 할 수 없기 때문에 최상위 수준에서 모든 예외를 포착하고 다시 기록해야합니다.
이제 이것은 대부분의 소프트웨어 응용 프로그램에서 문제가되므로이 문제에 대한 표준 솔루션이 있어야 소스에서 예외가 발생하고 한 번 기록됩니다. 그러나 나는 이것을 직접하는 방법을 볼 수 없습니다.
이 질문의 제목은 ' 멀티 티어 응용 프로그램에서 예외 로깅 '과 매우 유사 하지만 해당 게시물의 답변에 세부 정보가 부족하고 내 질문에 대답하기에 충분하지 않습니다.
The easiest solution would be to implement the logging at the top level
- 이 작업을 수행. 소스에서 예외를 기록하는 것은 좋은 생각이 아니며 내가 겪은 모든 응용 프로그램은 디버깅 할 PITA였습니다. 예외를 처리하는 것은 호출자의 책임입니다.
try{ ... } catch(Exception ex) { Log(ex); }
에 동일한 예외가 기록됩니다. (또한 코드 기반의 모든 계층에서 모든 예외를 잡는 것은 나쁜 습관처럼 보입니다.)