【问题标题】:difference between error_logger and error_logger_tty_h handlererror_logger 和 error_logger_tty_h 处理程序之间的区别
【发布时间】:2018-05-10 09:56:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: 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 节点。这可确保错误记录器事件始终以“回家”的方式记录在其组长进程的节点上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2012-05-04
      相关资源
      最近更新 更多