#!/usr/bin/env perl # # saku-log.pl - saku log colorizer. # #usage. # tail -f logfile | saku-log.pl # # grep foobar logfile | saku-log.pl | less # use strict; use warnings; BEGIN { $| = 1 } #stdout flush my $GREEN = "\e[36m"; my $RESET = "\e[0m"; my $IP = "\e[32m"; my $WARN = "\e[33;1m"; my $ERRNO = "\e[31;1m"; my $INFO = "\e[35;1m"; my $UA = "\e[96;1m"; my $BASE = $GREEN; my $ip_pattern = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{0,6})?'; while (my $line = <>) { chomp $line; $line = $BASE . $line . $RESET . "\n"; $line =~ s|<>|$RESET<>$BASE|g; $line =~ s|($ip_pattern)|$RESET$IP$1$BASE|g; $line =~ s|(<>\Q${BASE}\Etalk: http://)([^\d].+?)/|$1$RESET$IP$2$RESET$BASE/|; #info $line =~ s|<>\Q${BASE}\E(shingetsu.+(started\|finished))|<>$INFO$1|; $line =~ s|(client timeout)|$RESET$INFO$1$RESET|; $line =~ s|<>\Q${BASE}\E(direct).+?m<>|<>\e[35m$1$RESET<>|; #warning $line =~ s|Warning: |${WARN}Warning:$RESET |; $line =~ s|(: records not found\.)|\e[33m$1$RESET|; $line =~ s|(: too large or spam record.)|\e[33m$1$RESET|; $line =~ s|(\Q${BASE}\EIOError|<>IOError|; $line =~ s|(\[Errno \d+\])|$ERRNO$1$RESET|; $line =~ s|(: error)|\e[31m$1$RESET|; $line =~ s|<>\Q${BASE}\E(binascii.Error:)( .+)|<>\e[31m$1$RESET$2|; $line =~ s|: (HTTP Error \d+:.+)|: $RESET\e[31m$1|; $line =~ s|<>\Q${BASE}\E(code \d+.+?)\(|<>\e[33m$1$RESET\(|; $line =~ s|<>\Q${BASE}\E(-+)|<>$1|; $line =~ s|<>\Q${BASE}\E( *File "/usr/.+/python3\..+)|<>$1|; $line =~ s|<>\Q${BASE}\E(Exception\|Traceback\|AttributeError)(.+)|<>$1$2|; $line =~ s|^\Q${BASE}\E([^\d]+?.*)|$1|; #UA $line =~ s|<>\Q${BASE}\E(shinGETsu.+?)(\(.+?\)).+?m$|<>\e[35m$1$RESET$2|; $line =~ s|(\(.+?\))$|\e[34m$1$RESET|; $line =~ s|<>\Q${BASE}\E(Mozilla/5.0 \(.+\|ia_archiver\|Hatena::Fetcher/.+\|Python-urllib/.+\|CCBot/.+\|ltx71.+)|<>$UA$1|; print $line; } print "$RESET"; __END__