POCO :: Logger有一个名为LogStream的类,它为记录器实现了一个ostream。
我正在尝试编写一个类包装器来为我的项目实现一个日志系统。
到目前为止,我有这个: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;
};
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 ++的经验,但写一个包装对我来说是全新的。所以我需要一些帮助。
感谢。
答案 0 :(得分: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(),则应使用Mutex屏蔽LogStream创建时间。