2010-03-03 4 views
3

여러 유틸리티 클래스 내에서 로깅을 채택하고자합니다. 지. DBI. Log :: Log4perl을 사용하여 가장 좋은 방법은 무엇입니까?유틸리티 클래스 내에서 로깅

DBI (예 : MyDBI)를 서브 클래스 화하고 거기에서 몇 가지 메소드를 오버라이드하여 로깅하도록 할 수 있다고 생각합니다. 그러나 카테고리에는 문제가 있습니다. 당신이

Log::Log4perl->get_logger(ref $self || $self) 

와 로거를 만들 경우 모든 로그 항목 MyDBI에 속하고 그들을 필터링 어려울 것이다. 따라서 호출 모듈 (예 : MyModule)에서 MyDBI에 로거를 전달하는 것이 나을 것 같습니다. 따라서 카테고리는 의미 상 올바를 수 있습니다. 첫 번째 질문은 일반적으로 괜찮습니까? 내 말은, 그러한 접근에 숨겨진 암초가 있는가?

두 번째 질문은 로거를 MyDBI으로 전달하는 방법입니다. 나는 전역 변수를 선언하는 아이디어를 가지고있다. 지. $MyDBI::logger 및 호출 메서드에서 설정 :

local $MyDBI::logger = Log::Log4perl->get_logger(ref $self || $self); 

전역 변수에 대한 전통적인 싫어함이 있습니다. 더 나은 방법을 생각해 볼 수 있습니까?

편집 : 물론 최고의 코드는 코드가 아닙니다. 상속을 고려한 경우 caller이면 충분합니다.

세 번째 질문은 계층 적으로 관련이없는 경우 Log :: Log4perl과 함께 MyDBIMyModule 두 범주에 모두 로그인 할 수 있습니까?

답변

2

발신자에게 log4perl과 독립적으로 모듈을 실행할 수 있도록 함수 또는 모듈별로 별도의 로거에서 발신자를 독립적으로 로그하는 것이 좋습니다. 각 모듈은 Log::Log4perl->get_logger("module name")으로 자체 로거를 생성합니다.
호출자가 appender를 작성하지 않으면 프로그램은 단순히 아무것도 기록하지 않고 모듈의 log4perl은 기능적인 관점에서 무시됩니다.
Log4Perl은 전역 변수와 비슷한 로거를 생성하기위한 단일 패턴을 구현합니다.
로깅은 가능한 한 세분화되어야하며 어림짐작으로 입력 매개 변수와 함수/메소드의 결과를 디버그합니다. 정말로 필요한 경우 스택 추적을 사용하여 오류 조건으로 연결된 호출자를 찾을 수도 있습니다. 매개 변수에 추가하면 복잡성이 추가됩니다.

다음과 같은 조리법으로 log4perl의 구성 측면에서 유연성에 대한 아이디어를 얻을 수 있습니다. Log4Perl Recipes 나를위한 전체 아이디어는 코드를 변경하지 않고 실제 로깅/버그 추적 요구 사항 (향후 변경 될 수 있음)에 따라 로깅 구성을 변경하는 것입니다. 가능한 경우 코드를 변경하지 않고 유지하려면 모든 호출 프로그램을 테스트하지 않으려 고 할 때 모듈을 사용하는 것이 더 중요합니다.

간단한 질문에 답변하십시오. 1. 각 모듈마다 고유 한 로거가 있어야합니다. 2.) 로거를 인터페이스에 추가하지 마십시오. 3. Log4Perl은 appender 구성에 따라 모든 레벨로 로그온합니다. 이렇게하면 볼 수없는 것을 제어 할 수 있습니다. 정상 레벨은 일반적으로 INFO이고 특정 모듈은 디버그 상태 일 수 있습니다. 나쁜 경우 패턴 레이아웃을 사용하면 스택 추적을 순전히 구성으로 로깅에 추가 할 수 있습니다.

+0

실례지만, 첫 문장을 이해하지 못했습니다. "호출자", "log4perl과 독립적으로 모듈 실행"은 무엇을 의미합니까?좀 더 명확하게 해주시겠습니까? – codeholic

+0

예. 테스트 클래스를 작성할 때 반드시 log4perl을 구현하지는 않을 모듈을 만들 수 있습니다. 인터페이스의 일부인 경우 로직을 많이 추가해야하지만 건너 뛸 수 있습니다. – weismat