【问题标题】:difference between error_logger and error_logger_tty_h handlererror_logger 和 error_logger_tty_h 处理程序之间的区别
【发布时间】:2018-05-10 09:56:21
【问题描述】:
【问题讨论】:
标签:
erlang
elixir
erlang-nif
【解决方案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 节点。这可确保错误记录器事件始终以“回家”的方式记录在其组长进程的节点上。