2013-06-03 3 views
1

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

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

до сих пор у меня есть:

h.

#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; 
}; 

СРР

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 должен пережить выполнение оператора(); попробовать что-то вдоль этих линий:

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

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

+0

Благодарю вас за внимание. :) – jsilva

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