App-JsonLogUtils
view release on metacpan or search on metacpan
#!perl
# ABSTRACT: an interactive shell for monitoring JSON log files
# PODNAME: jshell
use strict;
use warnings;
$0 = 'jshell';
use Getopt::Long;
use Pod::Usage;
use List::Util qw(max);
use Term::SimpleColor;
use Term::SimpleColor qw(:background);
use Term::ReadLine;
use Iterator::Simple qw(iterator igrep imap);
use App::JsonLogUtils qw(lines tail json_log);
#-------------------------------------------------------------------------------
# Parse command line options
#-------------------------------------------------------------------------------
my $help = 0;
my $path;
GetOptions(
'help' => \$help,
'path=s' => \$path,
) or pod2usage(2);
do{ pod2usage 1; exit 0; } if $help;
#-------------------------------------------------------------------------------
# Set up global environment
#-------------------------------------------------------------------------------
my $default_prompt = green . '$ ' . default ;
my $prompt = $default_prompt;
my $term = Term::ReadLine->new('jshell');
my (@fields, %match, %skip);
#-------------------------------------------------------------------------------
# Utilities
#-------------------------------------------------------------------------------
sub out { print { $term->OUT } @_, default, "\n" }
sub set_prompt { $prompt = shift || $default_prompt }
#-------------------------------------------------------------------------------
# Iterators
#-------------------------------------------------------------------------------
sub filtered {
my $json = shift;
return igrep{
my ($obj, $line) = @$_;
foreach my $key (keys %match) {
foreach my $pattern (@{ $match{$key} }) {
return unless ($obj->{$key} || '') =~ /$pattern/;
}
}
foreach my $key (keys %skip) {
foreach my $pattern (@{ $skip{$key} }) {
return unless ($obj->{$key} || '') !~ /$pattern/;
}
}
return 1;
} $json;
}
sub formatted {
my $filtered = shift;
imap{
( run in 2.501 seconds using v1.01-cache-2.11-cpan-d8267643d1d )