I am working on a decentralized Erlang application. I am currently working on a single PC and creating multiple nodes by initializing erl
with the -sname
flag.
When I spawn a process using spawn/4
on its home node, I can see output generated by calls io:format/2
within that process in its home erl
instance.
When I spawn a process remotely by using spawn/4
in combination with register_name
, output of io:format/2
is sometimes redirected back to the erl
instance where the remote spawn/4
call was made, and sometimes remains completely invisible.
Similarly, when I use rpc:call/4
, output of io:format/2
calls is redirected back to the erl
instance where the `rpc:call/4' call is made.
How do you get a process to emit debugging output back to its parent erl
instance?
You can supply 1st argument to io:format/3 on the second node, using result of erlang:group_leader() from the first node.
Starting first node, registering local shell process group leader globally:
erl -sname a
(a@localhost)1> global:register_name(global_io_srv, group_leader()).
yes
Starting second node, connecting, using globally registered process as io device
erl -sname b
(b@localhost)1> net_kernel:connect(a@localhost).
true
(b@localhost)2> io:format(global:whereis_name(global_io_srv),"test output",[]).
ok
You will see test output in the first node. This is the same way that Christian suggested, just a bit more explicit. So you can have error_logger for production logging and io:format/3 just for quick debugging.
What you are seeing is processes with their group leader set to a pid on the node they were spawned from. See erlang:group_leader. The group leader is where they send their output to.
You call this output "debugging output", so are you sure that you dont want to start the sasl application on the nodes and use error_logger?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With