1# The client sends messages with different facility and severity. 2# The syslogd writes into multiple files depending on priority. 3# The syslogd writes it into a file and through a pipe. 4# The syslogd passes it via UDP to the loghost. 5# The server receives the message on its UDP socket. 6# Find the message in client, file, pipe, syslogd, server log. 7# Check that the messages appear in the correct log files. 8 9use strict; 10use warnings; 11use Sys::Syslog; 12 13my (@messages, @priorities); 14foreach my $fac (qw(local5 local6 local7)) { 15 foreach my $sev (qw(notice warning err)) { 16 my $msg = "$fac.$sev"; 17 push @messages, $msg; 18 no strict 'refs'; 19 my $prio = ("Sys::Syslog::LOG_".uc($fac))->() | 20 ("Sys::Syslog::LOG_".uc($sev))->(); 21 push @priorities, $prio; 22 } 23} 24 25my %selector2messages = ( 26 "*.*" => [@messages], 27 "*.info" => [@messages], 28 "*.notice" => [@messages], 29 "*.warning" => [ grep { /\.(warning|err)$/ } @messages], 30 "*.err" => [ grep { /\.err$/ } @messages], 31 "*.crit" => [], 32 "*.none" => [], 33 "local5.*" => [qw(local5.notice local5.warning local5.err)], 34 "local5.info" => [qw(local5.notice local5.warning local5.err)], 35 "local5.notice" => [qw(local5.notice local5.warning local5.err)], 36 "local5.warning" => [qw(local5.warning local5.err)], 37 "local5.err" => [qw(local5.err)], 38 "local5.crit" => [], 39 "local5.none" => [], 40 "local5.warning;local5.err" => [qw(local5.err)], 41 "local5.err;local5.warning" => [qw(local5.warning local5.err)], 42 "local6.warning;local7.err" => [qw(local6.warning local6.err local7.err)], 43 "local6.err;local7.err" => [qw(local6.err local7.err)], 44 "local6,local7.err" => [qw(local6.err local7.err)], 45 "local6,local7.warning;local6.err" => [qw(local6.err local7.warning 46 local7.err)], 47 "*.*;local6,local7.none" => [qw(local5.notice local5.warning local5.err)], 48); 49 50sub selector2config { 51 my %s2m = @_; 52 my $conf = ""; 53 my $i = 0; 54 foreach my $sel (sort keys %s2m) { 55 $conf .= "$sel\t\$objdir/file-$i.log\n"; 56 $i++; 57 } 58 return $conf; 59} 60 61sub messages2loggrep { 62 my %s2m = @_; 63 my @loggrep; 64 foreach my $sel (sort keys %s2m) { 65 my @m = @{$s2m{$sel}}; 66 my (%msg, %nomsg); 67 @msg{@m} = (); 68 @nomsg{@messages} = (); 69 delete @nomsg{@m}; 70 push @loggrep, { 71 (map { qr/: $_$/ => 1 } sort keys %msg), 72 (map { qr/: $_$/ => 0 } sort keys %nomsg), 73 }; 74 } 75 return @loggrep; 76} 77 78our %args = ( 79 client => { 80 func => sub { 81 my $self = shift; 82 for (my $i = 0; $i < @messages; $i++) { 83 syslog($priorities[$i], $messages[$i]); 84 } 85 write_log($self); 86 }, 87 }, 88 syslogd => { 89 conf => selector2config(%selector2messages), 90 }, 91 multifile => [ 92 (map { { loggrep => $_ } } (messages2loggrep(%selector2messages))), 93 ], 94 server => { 95 loggrep => { map { qr/ <$_>/ => 1 } @priorities }, 96 }, 97 file => { 98 loggrep => { map { qr/: $_$/ => 1 } @messages }, 99 }, 100); 101 1021; 103