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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/>
À (at) Fri, 22 Feb 2008 09:03:48 +0300,
Mihamina Rakotomandimby <r12y@infogerance.us> é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/>
À (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/>
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)
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)
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
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.
Mihamina Rakotomandimby <r12y@infogerance.us> 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.
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.
À (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/>
À (at) Sun, 24 Feb 2008 22:52:41 +0300,
Mihamina Rakotomandimby <r12y@infogerance.us> é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/>
À (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/>
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/>
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/>
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/>