2013-06-03 33 views
1

POCO ::記錄器類有所謂LogStream已誰實施了記錄一個ostream的。POCO記錄器包裝

我試着寫一個類封裝來實現日誌系統爲我的項目。

到目前爲止,我有這樣的:

的小時。

#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:

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

此代碼:

MyLogger mylog; 

和函數內complile和運行,但生成acc當我嘗試寫入一個日誌行時發生違規行爲。

老實說,我沒有得多想法什麼即時通訊做,我有經驗與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; 
}; 

如果從多個線程調用operator(),則應該使用Mutex屏蔽LogStream創建時間。

+0

謝謝你的時間。 :) – jsilva