use DateTime; sub Avg_Time_Taken_Per_Transaction { avg_time_taken_in_QnA(@log_paths); } sub avg_time_taken_in_QnA { print "in avg_time_taken_in_QnA\n"; die if not @_; print "@_\n"; my @log_files = @_; open(AVG_OUT,">avg_time") or die "cannot create file avg_time for writing"; my %mon2num = qw( Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep 9 Oct 10 Nov 11 Dec 12 ); my ( $start_dt, $end_dt ); for my $log_file (@log_files) { open my $log, '<', $log_file or die "Can't open '$log_file' for reading."; printf AVG_OUT "Processing file $log_file...\n"; while( <$log> ) { s{\s+\z}{}; #m/^\s*\w+\s+(\w+)\s+(\d+)\s+(\d\d:\d\d:\d\d\.\d\d\d)\s+(\d+)\s+..*pid\s+(\d+)\s+tid\s+(\d+):..*RiskServer : Read.*/i) if (/(?:Entering|Exiting) QnAModule::authenticate/) { $end_dt = ''; my @dtA = split; my @time = split /[:.]/, $dtA[3]; ( /Exiting/ ? $end_dt : $start_dt ) = DateTime->new( year => $dtA[4], month => $mon2num{ $dtA[1] }, day => $dtA[2], hour => $time[0], minute => $time[1], second => $time[2], nanosecond => $time[3], ); if ($end_dt && $start_dt) { printf AVG_OUT "start: ", $start_dt, "\n"; printf AVG_OUT "end: ", $end_dt, "\n"; my $e = $end_dt->subtract_datetime($start_dt); printf AVG_OUT "elapsed time for QnA Module: %s year(s), %s month(s), %s week(s), %s day(s), %s hour(s), %s min, %s sec, %s ms\n", $e->years, $e->months, $e->weeks, $e->days, $e->hours, $e->minutes, $e->seconds, $e->nanoseconds; } } } close $log or warn; } close (AVG_OUT); }