애플리케이션에서 정적 로깅 메소드를 사용하는 대신 로거 오브젝트를 작성하는 이유는 무엇입니까?


14

간단한 Ruby on Rails 애플리케이션의 예를 들어 보자. Logger애플리케이션로드 프로세스 중에 오브젝트를 작성합니다 .

# in environment.rb
config.logger = Logger.new(<STDOUT | file | whatever>)

# and in our application we use this object
logger.warn "This process is taking too long to process. Optimization needed."

제 질문은 로깅에 클래스 메소드 (또는 정적 메소드)를 사용하지 않는 이유는 무엇입니까? Logger.warn보다 확장 되지 Logger.new.warn않습니까? 아니면 적어도 Logger.warn직관적 인 것 같습니다 Logger.new.warn.

Logger.new싱글 톤 객체 인 경우에도 어떤 이점이 있습니까?

답변:


17

다음은 Java를 사용하는 예입니다. log4j를 사용한 지 오래되었지만, 내가 기억하는 것에서 전체 log4j 로깅 도구는 XML 파일에서 초기화됩니다. XML 파일 자체에는 구성이 다른 여러 로거가 포함될 수 있습니다 (쓰기 위치, 작성된 레벨 등). 따라서이 경우 호출하려는 로거를 지정하기 위해 로거 정적 메소드가 아닌 로거 오브젝트가 있습니다. 즉.

Logger logger = Logger.get("Network");

네트워크 연결, 손실 된 패킷 등과 관련된 사항을 기록하거나

Logger logger = Logger.get("Application");

비즈니스 로직 / 애플리케이션과 관련된 사항을 기록합니다. 적어도 log4j를 사용하면 실제로 기록되는 로그 수준 (정보, 추적, 경고, 오류, 디버그가 사용 가능한 기본 수준임)을 구성 할 수도 있습니다.

정적 메소드가있는 경우 표준 출력, 파일 등을 가리키는 단일 로거를 구성하는 것이 가장 좋지만 로그하는 모든 것은 동일한 위치로 이동합니다. 로거 객체를 사용하면 로깅 정보를 여러 파일로 분산시킬 수 있습니다.


감사. 또한 정적 메소드 사용시기를 이해하는 데 도움이되었습니다.
Harsh Gupta

2
로깅을 수행하기 위해 객체를 인스턴스화하는 것을 선호하지만 여기에 설명 된 것처럼 모든 메소드 호출에 객체를 전달하는 대신 정적으로 액세스하는 것이 일반적입니다. 로깅은 본질적으로 일종의 글로벌입니다.
Chad Schouggins

또한 로거를 확장하여 (또는 일부 인터페이스의 구현을 제공하고 로거에 제공하여) 로거를 구성하려는 경우가 있습니다. 이는 구성 파일이 허용 할 수있는 것 이외의 로깅 대상 변경과 같은 작업을 수행하는 데 사용됩니다. @ChadSchouggins가 언급했듯이 특정 인스턴스를 정적으로 만들 수 있습니다.
Kat

2

Logger.new는 결과가 사용될 곳 (클래스 / 파일 이름)을 취하는 팩토리입니다.

구성 파일에서 프로젝트를 다시 컴파일하지 않고도 프로그램의 일부에 대해 전혀 로깅하지 않을 로그 수준을 결정할 수 있습니다.

따라서 릴리스 빌드에 대해 높은 수준의 로깅 (오류)을 제외한 모든 기능을 비활성화하고 디버깅중인 부분에 대해 가장 낮은 수준 만 활성화 할 수 있습니다.


2

정적 메소드 호출은 가능하면 피해야합니다. 적절한 의존성 주입에 대한 구식 대안이며 더 큰 코드베이스에서는 도움이되지 않습니다.

예를 들어 테스트 가능성을 고려하십시오. 정적으로 로깅을 호출하면 피험자에게 테스트중인 로깅 클래스를 제어 할 수 있습니다. Inversion of Control은 없습니다. 여기에 모의 객체 또는 다른 종류의 가짜를 주입 할 가능성이 없습니다. 로거를 SUT에 주입하면 로거를 조롱하여 주입 할 수있는 옵션이 제공됩니다.

논의중인 정적 메소드 호출의 종류에 비해 DI를 사용하는 것의 이점은 물론 테스트 가능성을 넘어 섭니다. 시스템에 두 개의 서로 다른 로거를 가지려면 어떤 일이 발생하는지, 기존 코드를 편집하지 않고 객체 그래프 만 구성하여 응용 프로그램 동작을 변경하는 옵션을 고려하십시오.

전반적으로 DI 접근법을 시도해 볼 것을 제안합니다. 따라서 나중에 코드를 테스트 할 수없고 다루기 어려울 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.