POCO регистратор

POCO :: Logger имеет класс с именем LogStream, который реализует ostream для логгера.

Я пытаюсь написать оболочку класса для реализации системы журналов для моего проекта.

пока у меня есть это:

ч.

#include "Poco/LogStream.h"#include "Poco/Logger.h"#include "Poco/FileChannel.h"#include "Poco/AutoPtr.h"
using Poco::Logger;
using Poco::FileChannel;
using Poco::AutoPtr;
using Poco::LogStream;

class MyLogger
{
public:
MyLogger();
Poco::LogStream& operator()();
~MyLogger();

private:
Poco::Logger& m_logger;
};

CPP

  MyLogger::MyLogger() : m_logger(Poco::Logger::get(APP_NAME))
{
/*
AutoPtr<FileChannel> pChannel(new FileChannel);
pChannel->setProperty("path", "c:\\teshss.log");
pChannel->setProperty("rotation", "2 K");
pChannel->setProperty("archive", "timestamp");

Logger::root().setChannel(pChannel);
Logger& logger = Logger::get(APP_NAME); // inherits root channel
*/
}

Poco::LogStream& MyLogger::operator()()
{
AutoPtr<FileChannel> pChannel(new FileChannel);
pChannel->setProperty("path", "c:\\teshss.log");
pChannel->setProperty("rotation", "2 K");
pChannel->setProperty("archive", "timestamp");

Logger::root().setChannel(pChannel);
Logger& logger = Logger::get("");
LogStream lstr(logger);
return lstr;
}

MyLogger::~MyLogger()
{
}

затем в моем проекте сначала я создаю экземпляр для MyLogger:

   MyLogger mylog;

и внутри функции:

   mylog() << "Hello world" << std::endl;

Этот код компилируется и запускается, но генерирует нарушение прав доступа, когда я пытаюсь написать строку журнала.

Честно говоря, я не имею большого представления о том, что я делаю, у меня есть опыт работы с C ++, но написание обертки для меня совершенно новое. Поэтому мне нужна помощь.

Благодарю.

1

Решение

Возвращение ссылки на созданное в стеке значение является неопределенным поведением:

Poco::LogStream& MyLogger::operator()()
{
//...
LogStream lstr(logger);
return lstr;
}

LogStream должен пережить выполнение operator (); попробуйте что-нибудь вроде этого:

class MyLogger
{
public:
MyLogger(): lstr(0) /* ... */ { }
~MyLogger() { delete lstr; }
// ...
Poco::LogStream& operator()()
{
// ...
if (!lstr) lstr = new LogStream(logger)
return *lstr;
}
private:
LogStream* lstr;
};

Если operator () вызывается из нескольких потоков, вы должны экранировать время создания LogStream с помощью Mutex.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]