【问题标题】:Logging errors when an Elixir OTP Supervisor detects a crashed process当 Elixir OTP Supervisor 检测到崩溃的进程时记录错误
【发布时间】:2017-09-08 09:10:37
【问题描述】:

Hex docs for Supervisor 中有一行声明:

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

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

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

【问题讨论】:

    标签: elixir erlang-otp erlang-supervisor


    【解决方案1】:

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

    如果您使用:simple_one_for_one 主管来启动工人孩子,并且您对这些孩子感兴趣,那么您可以考虑自己监控他们,而不是深入研究 SASL 的东西。例如

    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

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2018-12-20
      • 2016-06-23
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多