Erlang:error_logger和过载保护

时间:2015-11-30 06:50:58

标签: erlang otp

假设我有一个Erlang系统,它有时会变得很讨厌并产生很多警告,这些警告将被记录到文件中,如果日志记录没有阻止磁盘IO,系统仍应正常运行(即日志是“更多”或更少预期“)。 (这是一个现实世界的场景,不是我化妆的东西)

erlang没有error_logger没有过载保护,因此如果日志量非常大,日志记录将阻止磁盘IO并可能导致系统故障。

我的问题是,为什么error_logger默认没有过载保护,是因为如果您正确设计架构,实际上并不需要此功能?或者是因为这是某种高级功能,如果您需要此功能,您应该使用其他库,例如lager

1 个答案:

答案 0 :(得分:1)

我想说过载保护是一项功能,这是实施(和/或配置)的问题。

过载保护可能是日志工具包中的一个很好的功能,对某些人很有用,即使可能大多数人都不需要它,但是error_logger实际上是一个日志记录接口,一个旨在支持开发人员/集成商/用户可以选择插入的任意实现(每个实现具有完全不同的配置,具体取决于他们的功能),具体取决于他们的要求。

这可能并非详尽无遗,但会立即想到改变日志记录要求的事情是:

  • 应用程序(某些应用程序显然更多/更少/不同于其他应用程序)
  • 主机环境(例如传统或SSD存储的功能不同)
  • 应用程序的用例(最终用户或开发人员可能使用意味着更多或更少日志记录的配置进行部署)
  • 本地基础架构和标准(某些组织可能只使用本地日志,但其他组织可能会在所有地方使用系统日志,虔诚地)
  • 外部或第三方环境因素(例如与应用程序/节点通信的另一个网络服务,导致日志记录)

将记录界面实施分离非常重要,因为:

  • 开发人员可能会在项目中改变他们对日志记录实现的看法,并且解耦意味着这很容易
  • 系统管理员可能需要修改或覆盖开发人员默认设置,因为主机,用例,本地基础设施和其他环境因素等,其中一些开发人员可能无法预料

因此,因为它是一个接口,所以error_logger没有并且不应该有过载保护;它在error_logger的汇率之外。

我坦率地承认,可能有可能在界面中包含一些实现的合理论据,我可以设想在error_logger中包含过载保护等功能的论据,尽管我已经说过了,但是它已经说过了。滑坡。我会选择纯洁和简洁;我认为值得保持error_logger精益和意味着而不是允许额外的批量进入它,这将影响到处的每个日志记录实现的性能。走这条路,在你知道磁盘I / O阻塞的限制之前,它本身就是error_logger,因为它变得臃肿,并且不会有任何关系除了发明一个新的错误记录器而不是使用它之外。