gpt4 book ai didi

c++ - 替代 Logger 类的 Singleton

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:07 26 4
gpt4 key购买 nike

我正在设计一个共享库,它将主要为客户端应用程序提供一个具有特定日志记录功能的类。我宁愿不假设这个类可能如何被使用得更通用。

Logger 类的职责是用 header 和尾标封装应用程序数据,并将一行写入单个文件,文件路径由 指定应用程序,而不是它的名称。

Logger 类的第一个(简化的)骨架可以是:

class Logger
{
public:
Logger(const QString &filepath);
bool log(const QString &datas);
...

};

由于应用程序可以在任何地方和任何线程中使用此 Logger 类,我想确保 filepath 仅由应用程序设置一次,并且它是对 protected 并发文件访问线程安全。

单例模式似乎很适合这门课,但我问自己 3 个问题:

如何在不使用 C++11 或更新的编译器的情况下使其线程安全

第二点是 filepath 应该只被应用程序设置一次。使用 Singleton,我们仍然可以在 getInstance(const &QString filepath) 中添加一个 filepath 但即使这样确保 filepath 不会改变,它可能会在应用程序中以不同的参数调用,导致

// let's say this is the firstcall so filepath = filepath1 and won't change
Logger::getInstance(filepath1);
...
Logger::getInstance(filepath2); // Ok we still have filepath = filepath1
... // and so on from anywhere in the code and possibly from different threads

这会起作用。但从应用程序的角度来看,我发现这并不清楚,因为开发人员可能认为它在 filepath1filepath2 中创建了一个日志,但他不是。此外,每次客户端必须调用单例时,他都必须传递所有参数。理想情况下,filepath 应该只在客户端代码中设置一次,然后它只需调用 log 方法。如何让客户端应用更清晰?

最后一点是关于单例模式本身:我宁愿避免它,尤其是在多线程上下文中,因为良好的线程安全实现并不像看起来那么容易。我是否遗漏了一些明显的东西?

谢谢。

最佳答案

由于您使用的是 Qt,因此可以通过以下方式解决多线程问题:

class Logger
{
public:
bool log(const QString &datas)
{
QMutexLocker lock(&Logger::mutex);
//log ...
}

private:
static QMutex mutex;
};

所以你可以这样做:

Logger().log("some data");

关于路径,可以有一个static private QString来保存

private:
static QString path;

以及设置其值的方法

 bool setPath(QString path)
{
QMutexLocker lock(&Logger::mutex);
if(Logger::path.isEmpty())
{
Logger::path = path;
return true;
}
return false;
}

该方法有一个 bool 返回类型,只是为了通知路径是否已经设置,并且它可以是静态的以表明其应用程序范围的性质。

使用配置文件的更好解决方案:

     bool log(const QString &datas)
{
QMutexLocker lock(&Logger::mutex);
if(Logger::path.isEmpty())
loadPathFromConfiguration();
//log ...
}

一个更复杂的模式:

class Logger
{
public:
bool log(const QString &datas)
{
QMutexLocker lock(&Logger::mutex);
if(!path().isEmpty())
{
//log ...
}
}

virtual QString path() const = 0;

private:
static QMutex mutex;
};

这样一来,用户就被迫提供自己的实现,并且不可能认为可以有多个日志文件。

关于c++ - 替代 Logger 类的 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565388/

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