#!/usr/bin/perl -w use strict; use warnings; use File::Basename; use Class::Struct; # Task structure struct Task => { app => '$', arguments => '$', host => '$', replicationGroup => '$', stageIn => '$', stageOut => '$', startTime => '$', stopTime => '$', taskNumber => '$', thread => '$', workdir => '$', }; # Hash for storing all tasks my %tasks = (); my $taskCounter = 1; # Print basic usage info sub usage() { &crash("Usage: $0 "); } # Print error message and exit sub crash() { print STDERR "@_\n"; exit(1); } # Record that a task has started sub taskStarted() { # Input: 2013-12-17 16:42:13,135+0000 DEBUG swift JOB_START jobid=sleep-k5t2pajl tr=sleep arguments=[1] tmpdir=sleep-run002/jobs/k/sleep-k5t2pajl host=westmere $_[0] =~ s/jobid=|tr=|arguments=|tmpdir=|hostdir=//g; my @entryArray = split(/\s+/, $_[0]); my $date = $entryArray[1]; my $taskid = $entryArray[5]; my $app = $entryArray[6]; my $workdir = $entryArray[-2]; my $host = $entryArray[-1]; my $arguments = &getBracketedText($_[0]); my $t = Task->new(); $t->taskNumber($taskCounter); $t->app($app); $t->workdir($workdir); $t->arguments($arguments); $t->startTime($date); $t->host($host); $tasks{$taskid} = $t; $taskCounter += 1; } sub taskEnded() { # Input: 2013-12-17 16:42:38,520+0000 DEBUG swift JOB_END jobid=bash-1vngpnjl $_[0] =~ s/jobid=//g; my @entryArray = split(/\s+/, $_[0]); my $date = $entryArray[1]; my $taskid = $entryArray[-1]; my $t = $tasks{$taskid}; $t->stopTime($date); } sub getBracketedText() { $_[0] =~ /\[([^\]]*)\]/x; my $result = $1; $result =~ s/,//g; return $result; } sub printTasks() { no warnings; foreach my $key (sort { $tasks{$a}->taskNumber <=> $tasks{$b}->taskNumber } keys %tasks) { my $value = $tasks{$key}; printf "Task %s\n" . "\tApp name = %s\n" . "\tCommand line arguments = %s\n" . "\tHost = %s\n" . "\tStart time = %s\n" . "\tStop time = %s\n" . "\tWork directory = %s\n\n" , $value->taskNumber, $value->app, $value->arguments, $value->host, $value->startTime, $value->stopTime, $value->workdir, } } # Check usage if ( !$ARGV[0] ) { &usage(); } # Open Swift log my $swift_log_name = $ARGV[0]; open(SWIFTLOG, $swift_log_name) || &crash("Unable to open log file $swift_log_name"); # Read log, and send each entry (single or multi-line) to processLogEntry() while (my $line = ) { if ( $line =~ m/JOB_START/ ) { &taskStarted($line); next; } elsif ( $line =~ m/JOB_END/ ) { &taskEnded($line); next; } } # Print tasks &printTasks();