Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

remettre des logs apache dans l'ordre

5 réponses
Avatar
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)

5 réponses

Avatar
Paul Gaborit
À (at) Fri, 22 Feb 2008 09:03:48 +0300,
Mihamina Rakotomandimby écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
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".
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)


Avatar
Patrice Karatchentzeff
Mihamina Rakotomandimby a écrit :

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
    '---''(_/--'  `-'_)       



Avatar
Paul Gaborit
À (at) Sun, 24 Feb 2008 22:52:41 +0300,
Mihamina Rakotomandimby écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Patrick Mevzek
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
<http://www.dotandco.net/> <http://www.dotandco.com/>