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

difference between error_logger and error_logger_tty_h handler

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

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

结尾

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

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

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

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

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

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