2016-11-29 51 views
0

我在我的自定義類LogCp的構造函數中配置了這個log4cplus的靜態對象,並且在這個構造函數中我寫了一些測試代碼,它可以將信息正確地導出到指定的文件中,但當我調用GetInstance函數時,它將返回唯一的對象,它不能寫入日誌,並且錯誤消息是找不到文件記錄器的appender。它使我困惑,我在構造函數中調用了doConfigure(),記錄器配置正確,爲什麼我仍然在主函數中出現這個錯誤?我需要在寫日誌之前每次調用doConfigure()嗎? 以下是我的代碼:如何在自定義單例類中使用log4cplus

class LogCp 
{ 
public: 

    ~LogCp(); 
    static LogCp& GetInstance(); 
    static Logger _logger; 

private: 
    LogCp(); 
    LogCp(const LogCp&) = delete; 
    void operator =(LogCp const&); 

}; 

Logger LogCp::_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger")); 
//Logger LogCp::_logger = log4cplus::Logger::getRoot(); 

LogCp::LogCp() 
{ 
    log4cplus::Initializer initializer; 
    try { 
     PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("E:\\log4cplus.properties")); 
     //_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger")); 
     LOG4CPLUS_WARN(_logger, LOG4CPLUS_TEXT("logging....")); 
    } 
    catch (...) { 
     LOG4CPLUS_FATAL(_logger, LOG4CPLUS_TEXT("Exception occured...")); 
    } 
} 

LogCp& LogCp::GetInstance() 
{ 
    static LogCp vLogCp; 
    return vLogCp; 
} 

LogCp::~LogCp() 
{ 

} 

主要功能:

void logInitial() 
{ 
    LogCp::GetInstance(); 

} 

int main(int argc, wchar_t* argv[]) 
{ 
    logInitial(); 
    LOG4CPLUS_WARN(LogCp::GetInstance()._logger, LOG4CPLUS_TEXT("test")); 
} 

它可以在構造函數正常登錄,但除非我添加doConfigure將無法登錄main()函數「測試」 ()在LOG4CPLUS_WARN.why之前再次運行?

回答

0

您需要先配置庫,然後再嘗試使用它。 doConfigure()函數設置appender,沒有它將不會有輸出。

在您的ctor中使用log4cplus::Initializer initializer;是錯誤的。它會初始化庫並在構造函數的最後取消初始化它。對象必須在整個庫的使用過程中生存。

+0

感謝您的支持者,我只是刪除了「log4cplus :: Initializer初始化程序」,然後一切正常,沒有assert或errormsg,但所有記錄都會在我的進程結束時記錄下來。但是當我編譯我的程序,它警告我,我沒有使用DLL C CRT,因此我需要在使用它之前調用initialize()一次,我應該怎麼做才能在單例類中使用log4cplus?@wilx – TimGallin

相關問題