| AnyEvent-MP documentation | Contained in the AnyEvent-MP distribution. |
AnyEvent::MP::LogCatcher - catch all logs from all nodes
use AnyEvent::MP::LogCatcher;
This relatively simple module overrides $AnyEvent::MP::Kernel::WARN on
every node and sends all log messages to the node running this service.
No attempt to buffer log messages on connection loss, or retransmit lost messages, is done.
Starts catching all log messages from all nodes with level $level or
lower. If the $level is undef, then stop catching all messages
again.
Example: start a node that catches all messages (you might have to specify a suitable profile name).
aemp run profilename services '[["AnyEvent::MP::LogCatcher::catch",9]]'
Marc Lehmann <schmorp@schmorp.de> http://home.schmorp.de/
| AnyEvent-MP documentation | Contained in the AnyEvent-MP distribution. |
package AnyEvent::MP::LogCatcher; use common::sense; use Carp (); use POSIX (); use AnyEvent (); use AnyEvent::Util (); use AnyEvent::MP; use AnyEvent::MP::Kernel; use base "Exporter"; $AnyEvent::MP::Kernel::WARN->(7, "starting log catcher service."); our $LOGLEVEL; our %lport; # local logging ports # other nodes connect via this sub connect { my ($version, $rport, $loglevel) = @_; my $cb = sub { snd $rport, @_ if $_[0] <= $loglevel; }; push @AnyEvent::MP::Kernel::WARN, $cb; # monitor them, silently die mon $rport, sub { @AnyEvent::MP::Kernel::WARN = grep $_ != $cb, @AnyEvent::MP::Kernel::WARN; }; } sub mon_node { my ($node, $is_up) = @_; return unless $is_up; my $lport = $lport{$node} = port { my ($level, $msg) = @_; $msg =~ s/\n$//; printf STDERR "%s [%s] <%d> %s\n", (POSIX::strftime "%Y-%m-%d %H:%M:%S", localtime time), $node, $level, $msg; }; # establish connection AnyEvent::MP::Kernel::snd_to_func $node, "AnyEvent::MP::LogCatcher::connect", 0, $lport, $LOGLEVEL; mon $node, $lport; }
sub catch { $LOGLEVEL = $_[0]; kil $_, "restart" for values %lport; %lport = (); return unless defined $LOGLEVEL; mon_node $_, 1 for up_nodes; mon_nodes \&mon_node; () }
1