我都知道,error_logger
并且error_logger_tty_h
是 gen_event 的可交换处理程序error_logger
。
从他们的源代码中,我知道error_logger
报告消息以`io:format(user, String, Argserlang:display
)error_logger_tty_h
结尾
error_logger
我感到困惑的是,目的和目的有什么区别error_logger_tty_h
?
我都知道,error_logger
并且error_logger_tty_h
是 gen_event 的可交换处理程序error_logger
。
从他们的源代码中,我知道error_logger
报告消息以`io:format(user, String, Argserlang:display
)error_logger_tty_h
结尾
error_logger
我感到困惑的是,目的和目的有什么区别error_logger_tty_h
?
这主要记录在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 节点。这可确保错误记录器事件始终以“回家”的方式记录在其组长进程的节点上。