gpt4 book ai didi

c++ - POCO 记录器包装器

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:05 25 4
gpt4 key购买 nike

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

中国共产党

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

谢谢。

最佳答案

返回对堆栈创建值的引用是未定义的行为:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com