http://paperlined.org/dev/perl/parse/parse_syslog.pl
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Date; # VERY likely to be installed, since it's a dependency of CPAN and LWP
use Data::Dumper;
foreach my $syslog (sort {firstnum($b) <=> firstnum($a)} glob '/var/log/syslog*') {
my $fin;
if ($syslog =~ /\.gz$/) {
open $fin, '-|', 'gzip', '-dc', $syslog or die $!;
} else {
open $fin, '<', $syslog or die $!;
}
while (<$fin>) {
my %entry = %{parse_syslog_line($_) or next};
next unless ($entry{program} eq 'rsyslogd');
$entry{text} =~ s/^(\[.*?\])\s*// and $entry{origin} = $1;
print Dumper \%entry;
}
}
# parse one line of text from /var/log/syslog
sub parse_syslog_line {
# see full regexp at Parse::Syslog::_next_syslog()
$_[0] =~ /^(\S{3}\s+\d+\s\S+)\s+([-\w\.\@:]+)\s+([^:]+?)(?:\[(\d+)\])?:\s+(.*)/
and {date_human => $1, date => str2time($1), host => $2, program => $3, pid => $4, text => $5, line => $_[0]};
}
# extract the first number found within a string
sub firstnum {(shift =~ /(\d+)/)[0] || 0}
Generated by GNU enscript 1.6.4.