Erlang:error_logger 和过载保护

Erlang: error_logger and overload protection

假设我有一个 Erlang 系统,它有时会变得令人讨厌并产生很多警告,这些警告将被记录到文件中,如果日志记录不阻塞磁盘 IO,系统应该仍能正常运行,(即日志是"more or less expected")。 (这是真实场景,不是我编的)

erlang自带的error_logger没有过载保护,所以如果日志量很大,logging会阻塞磁盘IO,可能导致系统故障。

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

我会说过载保护是一个特性,那是实现的问题(and/or 配置) .

过载保护可能是日志工具包中的一个不错的功能,对某些人很有用,即使可能大多数人不需要它,但 error_logger 确实是一个日志记录 接口,一个旨在支持任意实现(每个实现都有不同的配置,具体取决于它们的特性),developer/integrator/user 可以根据他们的要求选择插入。

这可能并不详尽,但立即想到的更改日志记录要求的事情是:

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

将日志 接口 实现 分离非常重要,因为:

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

因此,因为它是一个接口,所以 error_logger 没有也不应该有过载保护;它在 error_logger 的职权范围之外。

我坦率地承认,有可能为在接口中包含一些实现提出合理的论据,而且我可以想象关于在 error_logger 中包含过载保护等功能的论据,尽管我已经说过了,但是这是一个湿滑的斜坡。我会选择纯粹和简单;我认为保持 error_logger 精简和平均是值得的,而不是让额外的体积潜入其中,这将影响每个日志记录实现的性能。走那条路,在你知道它之前,限制不会是磁盘 I/O 阻塞,它会是 error_logger 本身,因为它变得臃肿,并且没有什么可以做的除了发明一个新的错误记录器来代替。