Elixir OTP Supervisor检测到崩溃进程时记录错误

时间:2017-04-12 14:12:01

标签: elixir otp supervisor

Hex docs for Supervisor中,有一行说明:

  

使用此模块实施的主管具有一组标准的接口功能,并包含跟踪和错误报告功能。

不幸的是,我无法弄清楚如何做到这一点。我想要的是当Supervisor检测到童工已经崩溃并正在重新启动时触发的某种钩子/通知/事件。主要是,我只想记录一个工人崩溃的事实,以便我可以向用户显示此错误,在我的情况下,这需要将错误消息写入数据库中的字段。

我错过了什么?在某个地方,我可以传递一个在孩子被终止时会被调用的函数或模块吗?

1 个答案:

答案 0 :(得分:2)

儿童崩溃时的错误记录在BEAM中的SASL记录器中,我认为这是“标准接口函数集”所指的文档。有关更多详细信息,请参阅http://erlang.org/doc/apps/sasl/error_logging.htmlhttp://erlang.org/doc/man/error_logger.html

如果您正在使用:simple_one_for_one主管启动工作人员,那么您可能会考虑自己监控,而不是深入研究SASL的内容。 e.g。

def MyApp.SomeModule do
  use GenServer

  # ... init etc.

  def start_worker() do
    {:ok, pid} = SomeWorkerSupervisor.start_child()
    Process.monitor(pid)
  end

  def handle_info(:'DOWN', _, _, worker_pid, reason) do
    # ... something
  end
end

reason将是:

  

进程的退出原因,noproc(监视器创建时不存在进程或端口)或noconnection(没有连接到受监视进程所在的节点)。

(来自http://erlang.org/doc/man/erlang.html#monitor-2