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


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.