2015-10-19 50 views
0

我想在我正在開發的C++項目中實現記錄器。我想知道在每個類中單獨實現一個記錄器,還是使用log4cxx庫在每個類中實例化一個日誌記錄接口會更好。我想要實現的一些記錄器可以在現有類中記錄事件。接口與個人記錄器

在使用日誌接口,我的意思是:

class Logger 
{ 
private: 
    log4cxx::LoggerPtr firstLogger(log4cxx::Logger::getLogger("first.log")); 
    log4cxx::LoggerPtr secondLogger(log4cxx::Logger::getLogger("second.log")); 
public: 
    virtual void writeLogMessage(log4cxx::LoggerPtd logger, std::string msg); 
}; 

就是我通過傳遞LoggerPtr做的正確的方式在做什麼?因爲我需要能夠選擇使用哪個記錄器。另外,如果創建一個日誌接口更好,有人可以提出一個很好的例子,其中可以看到如何使用log4cxx實現這樣一個接口的實質嗎?所以,例如,什麼需要是私人的,什麼需要公開等。

+0

記錄器實際上是隻有*一個*實例的記錄器,並在需要時使用它 –

+0

至於如何「選擇」一個地方的單身模式(https://en.wikipedia.org/wiki/Singleton_pattern)要使用哪個記錄器,可以將其包裝在預處理器宏中,因此只能編寫例如'LOG1(「...」)',那個宏將得到正確的記錄器並用記錄器調用寫入功能。 –

回答

1

是的,你不應該重新在你的類中實現日誌記錄。它重複着你自己,並且磨礪每個班級的責任。然而,決定哪一個log4cxx::LoggerPtr使用聽起來像是某個呼叫類的東西不應該關心,聽起來像是應該在Logger類中作出的決定

但是,不要在類中創建實例。爲您的記錄器提供一個抽象類並將其傳遞給您的類的構造函數。不要將你的類綁定到一個記錄器實現,而應該選擇更高的位置或在你的IOC配置代碼中。 (我從來沒有使用國際奧委會在C++中,but this one看起來不錯。順便說一句,將讓您的記錄儀的多種實現解決您的多個log4cxx::LoggerPtr問題?

我真的認爲選擇怎樣的東西,已經發生爲可讀std::string msg格式而不是類,我會把一些抽象的Event類發送給記錄器,我一直試圖記住這個模式叫做什麼(如果它甚至是一個模式),here's an example of it in another language

+0

好的答案,只是對C++和IOC的評論 - 手動IOC佈線仍然存在於C++中,並且IOC _container_(這是您鏈接的內容)不是_needed_,它只是使它更容易(至少在C#和Java版本中 - 我見過的C++中沒有讓我想放棄手動方式:-)) –

+0

@JohannGerell是的。 Tbh,沒有一個容器看起來完全準備好。我只鏈接,因爲這促使我做一些Google搜索。我有點驚訝Boost至少沒有什麼東西。 C++不是我的第一語言,它顯示:D –