从当前的日志文件中,我只能选择最高的响应时间(R.T),但是我需要从中获取前20个最高值。

我拥有的日志文件中有数百万行具有不同的R.T(响应时间)的行。

日志文件格式

例:

00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00


代码1:

with open(r"file.txt","r") as f:
data = f.readlines()
# sort the data by response time descending using lambda as key
sorted_data = sorted(data,
                 key=lambda row: row.split()[10],
                 reverse=True)


输出:(R.T高的日志文件)

00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00


代码2

file = open(r"file.txt","r")
rts = []
for line in file:
line_array = line.split(" ")
rts.append(float(line_array[10]))
max_rt = max(rts)
print "Max R.T is :", max_rt
file.close()


输出:最高R.T

最大R.T是:R.T

帮我!!!

从日志文件中找到20个最大值。

最佳答案

为此,您可能要使用堆。 Python恰好有一个带有heapq函数的nlargest模块。这将使您不必存储每一行​​,而这是sort and slice方法所必需的。

from heapq import nlargest

with open('naveen.log') as f:
    top20 = nlargest(20, f, key=lambda L: float(L.split()[10]))

for t in top20:
    print(t)


您也可以使用deque,它的最大长度可以固定。例如collections.deque(maxlen=20)

请参阅我在上面的评论,以获取有关如何格式化数据的说明。当前,如果您将一行分割(在空格上),它将时间戳减半,并且您想要的参数位于第11个索引处。如果所有时间戳都具有+0800,则可以使用第11个索引,并且您很贴心,但是如果没有,那么您可能需要采用更复杂的方法来拆分字符串(正则表达式)。

关于python - 从原始日志文件中排序前20个最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42152091/

10-12 03:07