2008-09-02 2 views
3

C++에는 사실상 표준 로깅 도구가 없습니다. 내 경험에 의하면, 상점은 스스로를 굴립니다. 그러나 재사용 가능한 소프트웨어 구성 요소를 만들려고 할 때 약간의 문제가 발생합니다. 시스템의 모든 항목이 로깅 구성 요소에 의존하면 소프트웨어를 재사용 할 수 없게되므로 기본적으로 모든 다운 스트림 프로젝트가 로깅 프레임 워크를 실제로 원하는 구성 요소와 함께 사용해야합니다.C++ 로깅 프레임 워크가 재사용 가능성을 희생합니까?

구성 요소가 로깅 추상화에 의존해야하므로 IOC (dependency injection)는 실제로 문제에 도움이되지 않습니다. 로깅 구성 요소 자체는 파일 I/O, 트리거 메커니즘 및 기타 원하지 않는 종속성에 대한 종속성을 추가 할 수 있습니다.

독점적 인 로깅 프레임 워크에 종속성을 추가하면 구성 요소의 재사용 가능성이 희생됩니까?

답변

5

예. 그러나이 경우 의존성 주입이 도움이 될 것입니다.

추상 로깅 기본 클래스를 만들고 사용할 로깅 프레임 워크에 대한 구현을 만들 수 있습니다. 구성 요소는 추상 기본 클래스에 종속적입니다. 그리고 필요에 따라 al과 함께 구현을 주입합니다.

+0

+1, 필자는이 정확한 상황에 직면하고 있습니다. 프로젝트의 주요 구현에는 원하는 추가 정보를 기록하는 추상화 된 로깅 프레임 워크가 있습니다. 그러나 (다른) 로깅 프레임 워크가있는 라이브러리를 사용하지만 다행히도 , 그들은 또한 프레임 워크를 캡슐화하는 객체가 전달 될 것으로 기대합니다 ... 그래서 객체를 만들고, 현재의 로깅 프레임 워크의 관점에서 구현하고 멀리갑니다! – Arafangion

1

예, Mendelt가 맞습니다. 우리는 우리 제품에서 이것을 정확히 수행합니다. 모든 것은 ILogger 추상 인터페이스에 따라 다르지만 다른 것에 의존하지는 않습니다. 일반적으로 실행 가능 또는 고수준 DLL은 실제 구현 된 Logger 인터페이스를 구성하고 삽입하는 DLL입니다.

0

재 컴파일되지는 않지만 로깅 인터페이스를 제공하려는 라이브러리를 작성하려면 라이브러리 (사용자)가 콜백을 제공 할 수 있도록하는 것이 좋습니다.

라이브러리에서 초기화 로깅 할 때 콜백을 지정해야합니다. 그런 다음 글루 코드를 사용하면 라이브러리의 내용이 무엇이든 잘 재생할 수 있습니다.

콜백의 서명을 표준 함수처럼 보이게 만들 수 있다면, 항상 사용할 수있는 기능 일 수 있습니다. 실제로 로거가없는 경우 쉽게 기본 옵션을 제공합니다.

또한 호출자는 라이브러리의 구성 요소를 여러 번 인스턴스화했을 수 있으며 리소스 경합 또는 스레딩 문제에 대해 각각에 대해 다른 로거 콜백을 제공하려고합니다.

관련 문제