/ / Analyse des données du journal d'accès pour les adapter au format de base de données - python, mysql, perl, bash

Analyser les données du journal d'accès pour les adapter au format de base de données - python, mysql, perl, bash

J'ai un fichier CSV d'accès Web avec des statistiques qui ressemblent à ceci (généralement environ 20 000 enregistrements mais ceci est un exemple avec seulement 6 enregistrements):

servlet name, HTTP RC, response time, request timestamp
/servlet_A,200,3,[10/Nov/2013:11:00:12 +0000]
/servlet_B,302,10,[10/Nov/2013:11:00:12 +0000]
/servlet_C,200,17,[10/Nov/2013:11:00:12 +0000]
/servlet_A,200,30,[10/Nov/2013:11:00:15 +0000]
/servlet_B,302,16,[10/Nov/2013:11:00:15 +0000]
/servlet_C,200,11,[10/Nov/2013:11:00:15 +0000]

J'ai besoin de l'analyser au format suivant:

servlet name, requests count with latency in range 0-5, latency range 6-10, latency range 11-15, ...., latency range 196-200, HTTP 200 count, HTTP 302 count
servlet_A,1,0,0,0,0,1,0,....,2,0
servlet_B,0,1,0,1,0,0,0,....,0,2
servlet_C,0,0,1,1,0,0,0,....,2,0

Les fichiers sont situés sur un serveur CentOS avec des outils tels que Perl, Python, Bash. Le fichier de sortie serait utilisé pour charger dans une base de données MySQL tierce à laquelle je n’ai pas accès.

J'ai essayé d'écrire cela en bash mais mes calculs étaient unJ'ai essayé de placer le compte de latence en utilisant une division par 5, par exemple. latence = 11 et 11/5 = 2,2 et arrondi vers le haut. Cela signifie qu'un incrément de 1 doit être ajouté à la 3ème position, mais j'ai eu du mal à l'analyser correctement.

Peut-être existe-t-il d’autres options pour le faire (utilisation d’une base de données construite localement et exportation du fichier) ou d’autres options que je suis maintenant au courant; toute aide est donc la bienvenue!

Réponses:

0 pour la réponse № 1

Ceci est rapide et moche pour la conversion de données ponctuelle et ne suit aucune convention de bonnes pratiques de codage :-). En supposant que vos données sont en data.txt. Ne génère aucun en-tête.

#! /usr/bin/perl

# Sub-program to calculate latency counts for number range
# params: key, latency lower limit, latency upper limit
sub latencyCounts {
$latency_total = 0;
for ($i = $_[1]; $i <= $_[2]; $i++) {
$latency_total += $latency_counts{$_[0]}[$i];
}
return $latency_total;
}

# parse file and add data to arrays
open (FOO, "< data.txt");
while (<FOO>) {
chomp;
if (/^/(.+),(d{3}),(d+),[.+]$/) {
$httpcode_counts{$1}[$2]++;
$latency_counts{$1}[$3]++;
}
}
close (FOO);

# calculate and output totals
foreach (sort keys %httpcode_counts) {
$key = $_;
printf ("%s,%d,%d,%d,%d,...,%d,%dn",
$key,
latencyCounts($key, 0, 5),
latencyCounts($key, 6, 10),
latencyCounts($key, 11, 195),
latencyCounts($key, 196, 200),
$httpcode_counts{$key}[200],
$httpcode_counts{$key}[302]);
}

exit;

Quelqu'un pourrait probablement obtenir les mêmes résultats dans moins de la moitié du code ...?