我有一个应用程序,每次向它发出请求时都会写出日志。日期和时间信息是指函数的结束时间。通过使用执行时间,我们计算请求开始的时间。
以下是日志当前的样子:
year | month | day | hour | minute | seconds | Thread | UserName | ExecTime
2014 | 3 | 26 | 8 | 57 | 300 | 1 | file_download | 33.86
2014 | 3 | 26 | 8 | 57 | 45 | 1 | file_upload | 0.359
2014 | 3 | 26 | 8 | 57 | 55 | 1 | folder_browse | 0.234
2014 | 3 | 26 | 8 | 58 | 11 | 1 | sending_email | 0.14
2014 | 3 | 26 | 8 | 58 | 20 | 1 | browsing_favorites | 0.985
2014 | 3 | 26 | 8 | 58 | 29 | 1 | file_download | 0.266
2014 | 3 | 26 | 8 | 58 | 33 | 1 | file_upload | 0.296
2014 | 3 | 26 | 8 | 58 | 37 | 1 | file_zip | 0.25
2014 | 3 | 26 | 8 | 58 | 41 | 1 | view_properties | 0.0
2014 | 3 | 26 | 8 | 58 | 46 | 1 | file_download | 0.187
仅用于说明目的
由于请求可能跨越几分钟甚至几小时,因此很难逐分钟计算每个线程的利用率。以下输出说明了我所追求的输出:
Thread | month | day | hour | minute | % Busy
1 | 3 | 26 | 8 | 57 | 0.5
2 | 3 | 26 | 8 | 57 | 0.1
3 | 3 | 26 | 8 | 57 | 0.9
仅用于说明目的
例如,如果请求在 12:30:30 开始执行并在 12:32:30 结束,则上表将如下所示:
Thread | month | day | hour | minute | % Busy
1 | 3 | 26 | 12 | 29 | 0
1 | 3 | 26 | 12 | 30 | 0.5
1 | 3 | 26 | 12 | 31 | 1
1 | 3 | 26 | 12 | 32 | 0.5
1 | 3 | 26 | 12 | 33 | 0
仅用于说明目的
输出中的分钟数将是可以在日志中找到的第一个请求和最后一个请求之间的分钟数。
更新
以下是来自@TessellatingHeckler 澄清请求的摘要:
我知道这很难,但我只需要一种可以很好地转化为代码的方法。我很乐意使用 perl、powershell 或 java。
谢谢
最佳答案
类似以下内容将为您完成大部分工作。不过,您必须自己弄清楚 Busy 的实际含义:
use List::Util qw(sum);
use strict;
use warnings;
<DATA>; # Skip Header
my %thread;
while (<DATA>) {
chomp;
my @data = split /\s*\|\s*/;
push @{$thread{$data[6]}}, \@data;
}
print "Thread | month | day | hour | minute | ExecTime\n";
for my $id (sort {$a <=> $b} keys %thread) {
my $time = sum map {$_->[7]} @{$thread{$id}};
printf "%-6s | %-5s | %-3s | %-4s | %-6s | %.03f\n", $id, @{$thread{$id}[0]}[1,2,3,4], $time;
}
__DATA__
year | month | day | hour | minute | seconds | Thread | ExecTime ( seconds )
2014 | 3 | 26 | 8 | 57 | 32 | 1 | 33.86
2014 | 3 | 26 | 8 | 57 | 45 | 2 | 0.359
2014 | 3 | 26 | 8 | 57 | 55 | 3 | 0.234
2014 | 3 | 26 | 8 | 58 | 11 | 1 | 0.14
2014 | 3 | 26 | 8 | 58 | 20 | 2 | 0.985
2014 | 3 | 26 | 8 | 58 | 29 | 3 | 0.266
2014 | 3 | 26 | 8 | 58 | 33 | 3 | 0.296
2014 | 3 | 26 | 8 | 58 | 37 | 1 | 0.25
2014 | 3 | 26 | 8 | 58 | 41 | 2 | 0.0
2014 | 3 | 26 | 8 | 58 | 46 | 1 | 0.187
输出:
Thread | month | day | hour | minute | ExecTime
1 | 3 | 26 | 8 | 57 | 34.437
2 | 3 | 26 | 8 | 57 | 1.344
3 | 3 | 26 | 8 | 57 | 0.796
关于java - 生成线程利用率摘要,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22674892/