remettre des logs apache dans l'ordre

Le
Mihamina Rakotomandimby
Bonjour,

Un fichier de logs apache a été reconstitué n'importe comment à partir
des fragments crées par logrotate.
Je souhaiterai remettre les enregistrements dans l'ordre chronologique.
Voici un enregistrement typique:
80.12.72.20 - - [22/Feb/2008:06:11:59 +0100] "GET / HTTP/1.1" ()

Il s'agirait de trier le fichier sur le champ entre crochets.
(Le format de la date me gène mais c'est comme ça qu'il est)

Est-ce Perl est un bon outil pour ça?
Si oui, quel serait le fond de la résolution du problème:
- On stocke tous les enregistrements dans un Array (dictionnaire), puis
on trie, puis on reconstitue le fichier? Un peu compliqué.
- On fait un tri à (bulle|whatever) directement sur les lignes? Ca
prendra du temps, mais comment je gère ce format de date?

Si vous avez dans un premier temps le principe de traitement et
éventuellement un lien vers un module qui me faciliterais la tache, je
tenterais de démarrer avec.

Il y a 190978 lignes à trier et le fichier fait 41Mo.
Mais ma machine est suffisament puissante et RAMée.

Merci d'avance.

--
Huile Essentielle de Camphre http://www.huile-camphre.fr
Infogerance http://www.infogerance.us
(Serveurs, Postes de travail, Développement logiciel)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #1062562
À (at) Fri, 22 Feb 2008 09:03:48 +0300,
Mihamina Rakotomandimby
Un fichier de logs apache a été reconstitué n'importe comment à partir
des fragments crées par logrotate.
Je souhaiterai remettre les enregistrements dans l'ordre chronologique.
Voici un enregistrement typique:
80.12.72.20 - - [22/Feb/2008:06:11:59 +0100] "GET / HTTP/1.1" (...)

Il s'agirait de trier le fichier sur le champ entre crochets.
(Le format de la date me gène... mais c'est comme ça qu'il est)

Est-ce Perl est un bon outil pour ça?


Oui.

Si oui, quel serait le fond de la résolution du problème:
- On stocke tous les enregistrements dans un Array (dictionnaire),
puis on trie, puis on reconstitue le fichier? Un peu compliqué.


C'est pourtant ce qu'il y a de plus simple si le fichier tient en
mémoire.

- On fait un tri à (bulle|whatever) directement sur les lignes? Ca
prendra du temps, mais comment je gère ce format de date?


Trier les lignes d'un fichier (sans le charger en mémoire) n'est pas
obligatoirement simple.

Si vous avez dans un premier temps le principe de traitement et
éventuellement un lien vers un module qui me faciliterais la tache, je
tenterais de démarrer avec.


Pour le traitement du temps, les modules DateTime (pour les
comparaisons) et DateTime::Format::Strptime (pour le décodage de la
partie date du format apache) me semblent les plus appropriés.

Pour le tri, pour aller vite, il suffit de lire le fichier ligne par
ligne et pour chaque ligne, d'en extraire la date et de placer dans un
tableau un couple [ligne, date extraite]. Ensuite, on trie le tableau
sur les dates et on réécrit les lignes dans le bon ordre (c'est
presque aussi long à expliquer en français qu'à écrire en Perl ;-)).

Il y a 190978 lignes à trier et le fichier fait 41Mo.
Mais ma machine est suffisament puissante et RAMée.


Ça ne devrait poser aucun problème.

--
Paul Gaborit - Perl en français -
Mihamina Rakotomandimby
Le #1096514
Paul Gaborit wrote:
Je souhaiterai remettre les enregistrements dans l'ordre chronologique.
Voici un enregistrement typique:
80.12.72.20 - - [22/Feb/2008:06:11:59 +0100] "GET / HTTP/1.1" (...)


Pour le traitement du temps, les modules DateTime (pour les
comparaisons) et DateTime::Format::Strptime (pour le décodage de la
partie date du format apache) me semblent les plus appropriés.


Je n'arrive pas à voir la manière propre de décoder "Feb".
Il ne me semble pas voir de quoi le traiter dans ces Patterns:
http://search.cpan.org/dist/DateTime-Format-Strptime/lib/DateTime/Format/Strptime.pm#STRPTIME_PATTERN_TOKENS
Est-ce que je devrais fabriquer un dictionnaire local qui m'associae
"Feb" à "02" (pas l'entier 2 mais le string "02")?

--
Huile Essentielle de Camphre http://www.huile-camphre.fr
Infogerance http://www.infogerance.us
(Serveurs, Postes de travail, Développement logiciel)


Patrice Karatchentzeff
Le #1108447
Mihamina Rakotomandimby
Paul Gaborit wrote:
Je souhaiterai remettre les enregistrements dans l'ordre
chronologique. Voici un enregistrement typique: 80.12.72.20 - -
[22/Feb/2008:06:11:59 +0100] "GET / HTTP/1.1" (...)


Pour le traitement du temps, les modules DateTime (pour les
comparaisons) et DateTime::Format::Strptime (pour le décodage de
la partie date du format apache) me semblent les plus appropriés.


Je n'arrive pas à voir la manière propre de décoder "Feb".


%b ou %B ou %h
le mois en utilisant les noms correspondants à la
localisation. Les noms abrégés ou entiers peuvent être utilisés.

http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strptime.3.html

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       



Paul Gaborit
Le #1108859
À (at) Sun, 24 Feb 2008 22:52:41 +0300,
Mihamina Rakotomandimby
Je n'arrive pas à voir la manière propre de décoder "Feb".
Il ne me semble pas voir de quoi le traiter dans ces Patterns:
http://search.cpan.org/dist/DateTime-Format-Strptime/lib/DateTime/Format/Strptime.pm#STRPTIME_PATTERN_TOKENS
Est-ce que je devrais fabriquer un dictionnaire local qui m'associae
"Feb" à "02" (pas l'entier 2 mais le string "02")?


Pourtant l'extrait suivant me semble convenir :

* %b or %B or %h
The month name according to the current locale, in
abbreviated form or the full name.

Ici, c'est le %b (%h est équivalent à %b et %B reconnaît le nom du
mois en entier) qui devrait reconnaître 'Feb' à condition que le
'locale' ne soit pas positionné sur 'fr' ou autre chose d'aussi
exotique. ;-)

--
Paul Gaborit - Perl en français -
Patrick Mevzek
Le #1117294
Le Fri, 22 Feb 2008 09:03:48 +0300, Mihamina Rakotomandimby a écrit:
Un fichier de logs apache a été reconstitué n'importe comment à partir
des fragments crées par logrotate.
Je souhaiterai remettre les enregistrements dans l'ordre chronologique.
Voici un enregistrement typique:
80.12.72.20 - - [22/Feb/2008:06:11:59 +0100] "GET / HTTP/1.1" (...)

Il s'agirait de trier le fichier sur le champ entre crochets.
(Le format de la date me gène... mais c'est comme ça qu'il est)


Je pense qu'il y a un : en trop après 2008.

J'avais fait ca à une époque, c'est sale et méchant mais cela avait
fonctionné :
cat access.log | perl -ne 'BEGIN { @m{qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/}=("01".."12"); } m!^S+ S+ S+ [(S+)/(S+)/(d{4}):(d{2}):(d{2}):(d{2})s+!; print $3.$m{$2}.$1.$4.$5.$6." ".$_' | sort -n | cut -d -f 2-

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co

Publicité
Poster une réponse
Anonyme