伙计们,我们现在正在部署很多 Erlang 实例,我们看到错误被抛出并想检查它们......
通常我们使用远程 shell 连接到正在运行的实例并通过这种方式访问 Erlang 控制台,但这不适用于 rb 或错误消息......
如何远程访问我的 SASL 错误消息而不删除服务器、以非分离方式启动它并查看 shell?
伙计们,我们现在正在部署很多 Erlang 实例,我们看到错误被抛出并想检查它们......
通常我们使用远程 shell 连接到正在运行的实例并通过这种方式访问 Erlang 控制台,但这不适用于 rb 或错误消息......
如何远程访问我的 SASL 错误消息而不删除服务器、以非分离方式启动它并查看 shell?
我在 R11B 中遇到了这个问题,最终创建了一个 rb 的克隆,它可以在远程 shell ( http://github.com/archaelus/erms/blob/master/src/erms_rb.erl ) 上运行。诀窍是发现调用者的 group_leader,然后将输出发送到那里。
我可能应该整理一下并将其作为补丁提交给 rb。
${ROOTDIR}/bin/erl -name shell@${NODE_IP} -remsh ${NODE_NAME}
我通过 -remsh ( )启动我的远程 shell 。在那里,我将 rb_server group_leader 设置为 shell 的当前 group_leader,然后 rb 将其输出打印到活动 shell:
(cacherl@192.168.2.31)1> rb:start().
{ok,<0.213.0>}
(cacherl@192.168.2.31)2> group_leader(group_leader(),erlang:whereis(rb_server)).
true
(cacherl@192.168.2.31)3> rb:show(1).
PROGRESS REPORT <0.77.0> 2011-01-28 17:49:23
===============================================================================
supervisor {local,sasl_sup}
started
[{pid,<4543.96.0>},
{name,rb_server},
{mfargs,{rb,start_link,[[]]}},
{restart_type,temporary},
{shutdown,brutal_kill},
{child_type,worker}]
ok
(cacherl@192.168.2.31)4>
编辑:为方便起见,将其封装在一个函数中:
%% @doc Start the report browser and reset its group-leader.
%% For use in a remote shell
start_remote_rb() ->
{ok, Pid} = rb:start(),
true = erlang:group_leader(erlang:group_leader(), Pid),
ok.
问候,汤姆
我没有用过rb,所以我不太了解它,但也许这对你有帮助:
您可以将 SASL 错误报告处理程序设置为写入磁盘,请参阅http://www.erlang.org/doc/man/sasl_app.html:
sasl_error_logger = Value <optional>
Value
是其中之一:
...
{file,FileName}
安装sasl_report_file_h
在错误记录器中。这使得所有报告都转到文件FileName
中。FileName
是一个字符串。
...
我还依稀记得有一种方法可以安装自定义处理程序回调,但不幸的是,我现在似乎找不到它。