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

ker*_*520 0 erlang elixir erlang-nif

我知道这两个error_loggererror_logger_tty_h是gen_event的交换处理error_logger.

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

我感到困惑的,有什么区别error_logger,并error_logger_tty_h为目的?

Ric*_*rdC 6

这主要在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运行时进程的stdout - 这可能只是对于控制台或/ dev/null.它还可以缓冲一定数量的消息,以便稍后传递给更好的处理程序.

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

但这并不是故事的结束,因为error_logger模块仍将被注册为事件管理器的处理程序.在这个新角色中,它不进行任何打印或缓冲,但它负责将任何事件转发到Erlang节点,该节点对应于调度事件的进程的组长进程.这可以确保错误记录器事件始终以"主页"的方式记录在其组长进程的节点上.