我知道error_logger
和error_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
之间有什么区别?
答案 0 :(得分: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节点,该节点对应于调度事件的进程的组长进程。这可以确保错误记录器事件始终“回家”,以便在其组长进程的节点上进行登录。