我目前正在分析应用程序的性能。我首先查看应用程序生成的日志,并识别执行时间超过可接受时间的业务逻辑任务。
日志文件中的片段如下所示:
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
我的要求是找到执行每个任务所花费的总时间。例如,xmlRecord 35165 的任务 2 上花费的时间 = xmlRecord 35165 的任务 2 的结束时间 - xmlRecord 35165 的任务 1 的结束时间。
因此,我想要一种方法将具有相同 xmlRecord Id 的所有日志语句分组在一起,如下所示:
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
如果我可以如上所示对所有日志语句进行分组,我很快就能看到 Task2 花了 17 分钟来处理 xmlRecord 35165。
请注意,我在此处显示的日志并不是我的应用程序打印的确切日志,而只是一个示例。我希望能够对所有日志语句进行分组,以便特定 XML id 的日志始终是一个接一个。
我对外壳有点生疏,如果有人能给我指出一个已经做到这一点的衬里或脚本,我将不胜感激,这样我就不会浪费时间重新发明轮子。
答案1
作为初学者,为什么不在列上排序呢xmlRecord Id
? :-
sort -k 9 -o <out.log> <in.log>
这应该按数字顺序将它们分组在一起。如果您也想排序Task
,那么它可能会涉及awk
脚本或类似的内容。
这是如何运作的
该sort
命令可以通过多种方式对数据进行排序,在本例中,我们根据第 9 列中的值对其进行排序。除非另有指示,否则它将使用标准的字母数字排序。
.... -k 9 ....
示例中的其他参数只是指定要使用的输入文件(您的日志文件)以及将结果输出到的新文件-o <out.log>
.
答案2
如果您有足够的内存来加载整个文件,请尝试:
$ perl -ane '
push @h, [$F[1],(split(/:/,$F[8]))[1],$_];
END {
print map { $_->[2] }
sort { $b->[1] <=> $a->[1]
||
$a->[0] cmp $b->[0]
}
@h;
}
' file
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
解释
在处理文件时,我们创建一个数组
@h
,它的每个元素都是一个数组引用。每个数组 ref 包含三个元素:- 时间出现在日志文件中,例如
18:03:20,269
- XML 记录 ID
- 整个日志条目
- 时间出现在日志文件中,例如
最后,我们打印带有条件的结果:
- 首先按 XML 记录 ID 排序
$b->[1] <=> $a->[1]
,反之亦然 - 如果ID相等,我们按照log中出现的时间进行比较
$a->[0] cmp $b->[0]
- 首先按 XML 记录 ID 排序