2017-01-30 1 views
0

Je suis la structure de fichier journal suivante. Je veux connaître le temps de réponse maximum et vouloir imprimer le fichier journal qui a le temps de réponse le plus élevé (R.T) en utilisant python 2.7.11.Manipulation du fichier journal en utilisant python

La structure de mon fichier journal:

00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed 4.0(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 6.0(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 5.0(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 8.0(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 2.0(R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00 

Code utilisé:

file =open(r"logfile.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 

Sortie:

2.0 
2.0 
5.0 
8.0 
8.0 

Requête

La boucle for exécute toutes les lignes et imprime le temps de réponse intermédiaire. Enfin, le temps de réponse le plus élevé est imprimé.

Aidez-moi !!

Pour imprimer seulement le temps de réponse le plus élevé

Pour imprimer l'intégralité du fichier journal ayant le temps de réponse le plus élevé.

Comment stocker chaque chaîne dans une DICTIONNAIRE et récupérer les données qui ont besoin, par exemple. (Si les données est spécifié .le code doit imprimer le temps de réponse le plus élevé)

 1  2 3 4     5  6 7 8  9  10   11 
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed 4.0(R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00 
+0

Votre code ne peut pas générer la sortie que vous décrivez. Vous obtiendrez un 'ValueError' d'essayer de convertir par exemple. '4,0 (R.T)' à un flotteur. S'il vous plaît fournir un (correctement indenté) MCVE - [mcve] – SiHa

Répondre

0

Alors que les questions est un peu confus, je pense que cela aidera. Après avoir lu le journal, vous pouvez trier les lignes en utilisant une fonction lambda comme clé dans la fonction triée intégrée. Vous devez juste spécifier où le temps de réponse est dans la ligne. Je l'ai fait en séparant la ligne puis en se référant au temps de réponse par sa position d'index. Les commentaires dans le code ci-dessous peuvent le rendre plus clair.

# open the log file 
with open('logfile.txt', 'r') as f: 
    # read lines into list (one item per line) 
    data = f.readlines() 
# sort the data by response time descending using lambda as key 
sorted_data = sorted(data, 
        # response time is at index 10 in the split line 
        key=lambda row: row.split()[10], 
        reverse=True) 
# print the row with the highest response time 
print(sorted_data[0]) 
+0

Merci pour votre info. – Naveen

+0

Les données qui ont les valeurs flottantes 0.0 sont seulement imprimées par ce code. Les valeurs ayant 00.000 sont manquantes et n'ont pas été imprimées. Aidez moi! – Naveen

0

Ce qui suit devrait fonctionner:

import re 

with open(r"logfile.txt", "r") as f: 
    lines = f.readlines() 

lines_and_times = [] 

for line in lines: 
    RT = re.findall('(\d+\.\d+)\(R\.T\)', line, re.DOTALL) 
    if RT: 
     lines_and_times.append((float(RT[0]), line)) 

lines_and_times.sort(key=lambda tup: tup[0], reverse=True) 

print 'Max time: {}'.format(lines_and_times[0][0]) 
print 'Full log:' 
print lines_and_times[0][1] 

retour:

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

L'utilisation d'un regex nous permet de trouver le temps de réponse pour chaque ligne, que nous enregistrons en tant que tuple aux côtés de la pleine ligne. Nous trions ensuite une liste de ces tuples en fonction du temps de réponse (reverse=True nous donne l'ordre décroissant) et imprimons les informations de la première entrée de cette liste.

+0

Merci pour votre info – Naveen