TimGallin Ответов: 1

Как использовать 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"));
}

Он может правильно войти в функцию конструктора, но он не будет регистрировать "тест" в функции main (), если я снова не добавлю функцию doConfigure () перед LOG4CPLUS_WARN.why?

Что я уже пробовал:

прочитал много подобных вопросов, но все еще не могу решить этот

1 Ответов

Рейтинг:
2

KarstenK

То масштаб или продолжительность жизни ваш LogCp не охватывает основной объем. Это существенный чтобы понять эти вопросы. Это также очень важно при работе с указателями и объектами.

Это должно решить вашу проблему:

int main(int argc, wchar_t* argv[])
{
	LogCp::GetInstance();// create in scope of main
	// your code
	LOG4CPLUS_WARN(LogCp::GetInstance()._logger, LOG4CPLUS_TEXT("test"));
}


TimGallin

Он не работает,мне нужно позвонить doConfigure() функция снова в Main(),в Деыпзьапсе() функция,я вернусь статический объект vLogCp,срок его службы должен быть весь процесс,а статическая переменная-член vLogCp был быть парафирован в конструкторе функций,которые включают в себя doConfigure() уже,так почему я еще должен позвонить в doConfigure снова в Main()?
Ниже приведен мой текст конфигурации:
log4cplus.appender. R=log4cplus:: RollingFileAppender
log4cplus.приемщика.Р.Файл=output_${ENV_VAR}.журнал
log4cplus.приемщика.Р.Параметра maxfilesize=500кб
log4cplus.appender. R. MaxBackupIndex=5
log4cplus.appender.R. layout=log4cplus:: TTCCLayout

log4cplus.rootLogger=информация, р
log4cplus.регистратор.тест.а.б.с=предупредить
log4cplus.регистратор.журнала=предупредить, Р
log4cplus.аддитивности.журнала=ложь