Skip to content

Instantly share code, notes, and snippets.

@ryochin
Last active April 16, 2020 09:33
Show Gist options
  • Save ryochin/1106b8f22a51e5693fde2dda80304d3f to your computer and use it in GitHub Desktop.
Save ryochin/1106b8f22a51e5693fde2dda80304d3f to your computer and use it in GitHub Desktop.
Colorize Rails production log (filter)
#!/usr/bin/env perl
use strict;
use warnings;
use Term::ANSIColor;
local $| = 1;
while (<STDIN>) {
my $line = $_;
my $data = parse($line);
if ( exists $data->{line} ) {
print colorize_line( $data->{line} );
}
else {
print
colorize_level_short( $data->{level}, $data->{level_short} ),
colorize_datetime( $data->{time} ),
colorize_pid( $data->{pid} ),
colorize_level( $data->{level} ),
colorize_separator( $data->{separator} ),
colorize_message( @{$data}{qw(level message)} );
}
}
sub parse {
my $line = shift;
my $result = {};
if ( $line =~ /^([A-Z]), /o ) {
$line =~ s{
^([A-Z]),
\s
\[
([\w\d\-:\.]{20,})
\s
(\#\d+)
\]
(\s+[A-Z]+)
(\s+-+\s+:\s)
(.+)$
}{
$result->{level_short} = $1 // 'I';
$result->{time} = $2 // '';
$result->{pid} = $3 // '';
$result->{level} = $4 // 'INFO';
$result->{separator} = $5 // '';
$result->{message} = $6 // '';
}xe;
}
else {
$result->{line} = $line;
}
return $result;
}
sub colorize_line {
my ($line) = @_;
return colored( [ level_color('info') ], $line );
}
sub colorize_level_short {
my ( $level, $level_short ) = @_;
return colored( [ level_color($level) ], $level_short, ", " );
}
sub colorize_datetime {
my ($time) = @_;
return colored( ['blue'], "[$time " );
}
sub colorize_pid {
my ($pid) = @_;
return colored( ['magenta'], $pid ) . colored( ['blue'], ']' );
}
sub colorize_level {
my ($level) = @_;
return colored( [ level_color($level) ], $level );
}
sub colorize_separator {
my ($separator) = @_;
return colored( ['black'], $separator );
}
sub colorize_message {
my ( $level, $message ) = @_;
return colored( [ level_color($level) ], $message, "\n" );
}
sub level_color {
my ($level) = @_;
$level =~ s{^\s+}{}o;
if ( $level eq 'DEBUG' ) {
return 'cyan';
}
elsif ( $level eq 'INFO' ) {
return 'white';
}
elsif ( $level eq 'WARN' ) {
return 'yellow';
}
elsif ( $level eq 'ERROR' ) {
return 'red';
}
else {
return 'white';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment