error_logger 和 error_logger_tty_h 处理程序之间的区别

Posted

技术标签:

【中文标题】error_logger 和 error_logger_tty_h 处理程序之间的区别【英文标题】:difference between error_logger and error_logger_tty_h handler 【发布时间】:2018-05-10 09:56:21 【问题描述】:

我知道 error_loggererror_logger_tty_h 都是 gen_event error_logger 的可交换处理程序。

从他们的源代码中,我知道error_logger 报告消息以erlang:display 结尾,error_logger_tty_h 以`io:format(user, String, Args) 结尾

我感到困惑的是,error_loggererror_logger_tty_h 的用途有什么区别?

【问题讨论】:

【参考方案1】:

这主要记录在http://erlang.org/doc/man/error_logger.html 中,但基本上,error_logger 模块实现了用于启动和与 gen_event 服务器或“事件管理器”交互的 API,也称为 error_logger。该进程将接收事件并将它们传递给注册的处理程序。 API 模块包括诸如 error_msg(...) 之类的函数,用于以服务器期望的正确格式发送实际事件消息。

然而 - error_logger 模块还实现了 gen_event 回调函数,以便它可以注册为服务器的处理程序。这段代码可以(也许应该)放在一个单独的模块中,但好处是当错误记录器启动时,回调代码已经被加载了。

错误记录器由 Erlang 启动脚本在任何应用程序(包括内核应用程序)启动之前启动。当时,人们对系统的功能知之甚少,但基本的错误记录仍然需要工作。 error_logger 模块中的回调实现了原始日志记录,可将早期阶段的任何错误直接打印到 Beam 运行时进程的标准输出 - 可能只是到控制台或 /dev/null。它还可以缓冲固定数量的消息,以便稍后传递给更好的处理程序。

当内核应用程序启动时,它会读取内核应用程序环境设置并将error_logger处理程序交换为您真正想要的系统类型,例如error_logger_tty_h或error_logger_file_h。当它接管时,它还会从旧记录器获取任何缓冲的消息,因此它可以正确处理它们。

不过,故事还没有结束,因为 error_logger 模块仍将注册为事件管理器的处理程序。在这个新角色中,它不做任何打印或缓冲,但它负责将任何事件转发到与调度事件进程的组长进程相对应的 Erlang 节点。这可确保错误记录器事件始终以“回家”的方式记录在其组长进程的节点上。

【讨论】:

以上是关于error_logger 和 error_logger_tty_h 处理程序之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

3.EZMM工程(常用shell命令,及需要用到的基本依赖库)

无法启动 RabbitMQ

Rabbitmq服务器无法启动

如何编写节点列表的应用环境值?

尝试运行 Rabbitmq 时连接被拒绝

RabbitMQ CPU 占用过高优化