将具有相似文本的行打印在一起

将具有相似文本的行打印在一起

我目前正在分析应用程序的性能。我首先查看应用程序生成的日志,并识别执行时间超过可接受时间的业务逻辑任务。

日志文件中的片段如下所示:

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]

相关内容