libraries/clogger/pctools/cloggercolour.pl
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/clogger/pctools/cloggercolour.pl	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,187 @@
+#!perl
+# cloggercolour.pl
+# 
+# Copyright (c) 2006 - 2010 Accenture. All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Accenture - Initial contribution
+#
+
+use strict;
+use Getopt::Long;
+use IO::File;
+use IO::Handle;
+
+sub ParseCommandLineArgs();
+sub GetNextColour();
+
+my $clogFile;
+my $outFile;
+my $plainText;
+my $colour = 0;
+my $deltaTimeStamps = 0;
+my $verbose;
+
+ParseCommandLineArgs();
+
+my $logfile;
+my $htmlfile;
+
+if (defined $clogFile) {
+	print "Opening $clogFile for reading\n" if ($verbose);
+	$logfile = new IO::File;
+	$logfile->open("<$clogFile") or die "ERROR: Can't open $clogFile for reading: $!\n";
+} else {
+	print "Reading from STDIN\n" if ($verbose);
+	#$logfile = new IO::Handle;
+	#$logfile->fdopen(fileno(STDIN), "r") or die "ERROR: can't open STDIN: $!\n";
+	$logfile = *STDIN;
+}
+if (defined $outFile) {
+	print "Opening $outFile for writing\n" if ($verbose);
+	$htmlfile = new IO::File;
+	$htmlfile->open(">$outFile") or die "ERROR: Can't open $outFile for writing: $!\n";
+} else {
+	print "Writing to STDOUT\n" if ($verbose);
+	$htmlfile = *STDOUT;
+}
+unless ($plainText) {
+	print $htmlfile "<html><body><pre>\n";
+}
+
+my %tagColours = {};
+my $colours = 0;
+my $lastMillis = -1;
+
+while (my $line = <$logfile>) {
+	chomp $line;
+	if ($line =~ m/^(\d{4}-\d{2}-\d{2} \d{2}\:\d{2}\:\d{2}\.\d{3})\: \[([^]]+)\] (.*)$/ ) {
+		my ($time, $tag, $text) = ($1, $2, $3);
+		my $deltaStr = "";
+		unless (exists $tagColours{$tag}) {
+			$tagColours{$tag} = GetNextColour();
+		}
+		if ($deltaTimeStamps) {
+			$time =~ m|(\d{4})-(\d{2})-(\d{2}) (\d{2})\:(\d{2})\:(\d{2})\.(\d{3})|;
+			my ($year, $month, $day, $hour, $minute, $second, $millisecond) = ($1, $2, $3, $4, $5, $6, $7);
+			my $millis = ((((((((((($year*12)+$month)*31)+$day)*24)+$hour)*60)+$minute)*60)+$second)*1000)+$millisecond;
+			my $delta = 0;
+			if ($lastMillis != -1) {
+				$delta = $millis - $lastMillis;
+			}
+			$lastMillis = $millis;
+			$deltaStr = sprintf("(+% 4d)", $delta);
+		}
+
+		print $htmlfile "<font color=$tagColours{$tag}>" unless ($plainText) ;
+		print $htmlfile "$time:$deltaStr [$tag] $text";
+		print $htmlfile "</font>" unless ($plainText);
+		print $htmlfile "\n";
+	}
+	else {
+		print STDERR "WARNING: could not parse line $. of $clogFile\n";
+	}
+}
+
+
+unless ($plainText) {
+	print $htmlfile "</pre></body></html>\n"
+}
+undef $logfile;
+undef $htmlfile;
+
+sub ParseCommandLineArgs() {
+	Getopt::Long::Configure ("bundling");
+	GetOptions('v+' => \$verbose, 'c' => \$colour, 'd' => \$deltaTimeStamps, 'p'=>\$plainText);
+	if ($#ARGV != -1) {
+		$clogFile = shift @ARGV;
+	}
+	if ($#ARGV != -1) {
+		$outFile = shift @ARGV;
+	} else {
+		if (defined $clogFile) {
+			$outFile = "$clogFile.html";
+		}
+	}
+}
+
+my $colours = 0;
+
+sub GetNextColour() {
+	if ($colour) {
+		# make a new colour
+		my $pattern = $colours % 6;
+		my $newColour;
+		++$pattern;
+		if ($pattern > 3) {
+			$newColour = "#FF";
+			$pattern-=4;
+		} else {
+			$newColour = "#00";
+		}
+		if ($pattern > 1) {
+			$newColour = "${newColour}80";
+			$pattern-=2;
+		} else {
+			$newColour = "${newColour}00";
+		}
+		if ($pattern > 0) {
+			$newColour = "${newColour}FF";
+		} else {
+			$newColour = "${newColour}00";
+		}
+		++$colours;
+		return $newColour;
+	} else { 
+		return "#000000";
+	}
+}
+
+__END__
+
+=head1 NAME
+
+cloggerproc - Post-process clogger logs to add colour or timestamps
+
+=head1 SYNOPSIS
+
+	cloggerproc [options] [infile [outfile]]
+
+options:
+
+=over 4
+
+=item -d
+
+Add a millisecond delta to timestamps
+
+=item -c
+
+Colour logging lines based on the tag
+
+=item -v
+
+verbose output
+
+=item -h
+
+Show this help
+
+=back
+
+=head1 DESCRIPTION
+
+
+=head1 KNOWN BUGS
+
+If the timestamp month or year rolls over during the log, the delta will be incorrect for the first logging line in the new month/year.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2008-2010 Accenture. All rights reserved.
+
+=cut