2016-11-29 4 views
0

Я настраиваю этот статический объект log4cplus в своей конструкторской функции конструктора LogCp, и в этом конструкторе я пишу некоторый тестовый код, и он может экспортировать информацию в назначенный файл правильно, но когда я вызываю GetInstance fun ction, который вернет единственный объект, он не сможет записать журнал, и сообщение об ошибке не может найти приложение filelogger.It запутать меня, я вызвал 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() снова перед LOG4CPLUS_WARN.why?

ответ

0

Вам необходимо настроить библиотеку, прежде чем пытаться ее использовать. Функция doConfigure() устанавливает приложения, без которых не будет выхода.

Использование log4cplus::Initializer initializer; в вашем ctor неверно. Он инициализирует библиотеку и деинициализирует ее в конце конструктора. Объект initializer должен жить во время использования библиотеки.

+0

Спасибо за ваш anwser, я отключил «log4cplus :: Initializer initializer», тогда все в порядке, нет утверждений или errormsg, но все записи будут записываться в конце моего процесса. Но когда я скомпилировал моя программа, он предупредил меня, что я не использую DLL C CRT, поэтому мне нужно вызвать initialize() один раз, прежде чем использовать его, что мне делать, чтобы использовать log4cplus в одноэлементном классе? @wilx – TimGallin

Смежные вопросы