- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在设计一个共享库,它将主要为客户端应用程序提供一个具有特定日志记录功能的类。我宁愿不假设这个类可能如何被使用得更通用。
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
这会起作用。但从应用程序的角度来看,我发现这并不清楚,因为开发人员可能认为它在 filepath1
和 filepath2
中创建了一个日志,但他不是。此外,每次客户端必须调用单例时,他都必须传递所有参数。理想情况下,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/
作为一个新人中的菜鸡,最近在看一个项目的代码其中有这么一段看得我很是费解 public class AssembleMsgService { private static Logger logger
我已更改 Gradle 构建脚本以使用 Spring 2.0.1 而不是 1.5.9。当我运行 gradle build 时,出现错误:找不到符号 Logger logger = Logger.get
这是我的示例代码: public class Logs { private static Logs logHandler; public static Logs handler() {
我目前正在使用 Java 日志记录。我有一个记录器 cwh.A 和 cwh.B。是否可以通过 Java 从记录器 cwh 获取这些记录器,而不知道它们的名称? 最佳答案 可以通过日志管理器获取所有记录
在我的应用程序中,有一次我将 java.util.logging 的根 Logger 及其所有处理程序设置为 Level.FINEST,如下所示: Logger.getLogger("").setLe
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我刚刚将 Java 插件升级到 1.7.0_25,这导致我几年前编写的一个小程序出现 fatal error (此后一直在维护)。 在小程序的 init() 方法的早期,我调用了 logger = L
logger.debug 和 logger.info 有什么区别? logger.debug什么时候打印? 最佳答案 我建议你看看这篇名为 "Short Introduction to log4j"
Fixed I tried reinstalling the plugin but that didn't work so i completely cleared my inteljii idea
我定义了一个记录器实例如下: private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); 我有一个要记录的
我正在 Windows 下使用 Python 3.4.2。就我而言, import logging logger = logging.getLogger('logger') logger.setLev
我目前正在使用 C# 开发一个新的 Prism 项目,并想在我的 Bootstrapper 类中创建一个 NLog Logger。不幸的是,无论我做什么,它都拒绝构建,并告诉我... 'Logger.
我已经有几年没有使用 Log4J 了。我现在正在使用 org.jboss.logging 包在 JBoss 5 下开发一个应用程序。当我以前这样做时,将 logger.info() 消息包含在日志记录
ActiveRecord::Base.logger = Logger.new(STDOUT) 的 redis 等价物是什么?我想看看redis在做什么。 最佳答案 $redis.client.logg
我正在尝试使用 log4js 创建日志文件。完成所有配置后运行 Node app.js 时,我收到以下错误。 错误: TypeError: logger.setLevel is not a funct
我在一个拥有大约 50 多名开发人员的 IT 部门工作。它曾经有大约 100 多名开发人员,但由于经济衰退而被削减。 当我们的部门规模扩大时,我们雄心勃勃地努力建立一个特殊的架构小组。 这个小组决定做
我正在尝试找出跨多个模块使用 python 日志记录的最佳实践。我在这里看到:http://docs.python.org/2/howto/logging#logging-from-multiple-
我想将 Logger 注入(inject)到在 WildFly 10 上运行的 Maven 动态 Web 项目中的 bean 中。 我在 POM 中添加了依赖项。 WildFly 中提供了范围:
Java 9 引入了一个新的记录器,即 java.lang.System.Logger但我们总是有java.util.logging.Logger . 此记录器有什么新功能以及它有何改进? 最佳答案
我在 eclipse Mars 中配置了我的环境,但是 log4j 出现错误。我使用 spring 4 和 Maven 作为依赖管理器。部分代码: Eclipse 在这一行显示了一个错误,等于后的第二
我是一名优秀的程序员,十分优秀!