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++的经验,但是写包装对于我来说是全新的。所以我需要一些帮助。

谢谢。

最佳答案

返回对堆栈创建值的引用是 undefined 的行为:

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的创建时间。

关于c++ - POCO记录器包装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16906652/

10-11 22:46
查看更多