Forum Programmation.shell Lire des logs au fur et à mesure

Posté par (page perso) . Licence CC by-sa
1
11
juil.
2014

Bonjour,

j'ai besoin de lire des log (ceux d'un serveur web), et de les analyser pour en extraire certaines informations.

Pour extraire les infos, je vais utiliser awk, qui conviendra parfaitement.

Le fichier de log est rempli au fur et à mesure, et de temps en temps il y a une rotation.
Il faudrait que je puisse obtenir a chaque interval de temps les derniers logs, pour éviter les doublons et m'assurer que je ne vais pas non plus manquer les lignes qui vont s'ajouter après.

Je pourrai extraire des logs les lignes ayant un horodatage d'une période assez ancienne pour être certain que de nouvelles lignes n'auront pas d'horodatage correspondant au même interval.

  • Un cron qui serait lancé toutes les heures + 5 minutes, et j'extrairai des log les lignes avec un horodatage entre H-1 et H. Avec une vérification en cas de rotation.

Avez-vous d'autres idées? des trucs déjà fait?

Merci
Grégoire

  • # tail ?

    Posté par . Évalué à 2.

    Un tail ne te suffit pas ?
    genre :

    bash$ tail -1 /mon/fichier/de/log | ma_command_traitant_une_ligne

    • [^] # Re: tail ?

      Posté par . Évalué à 3.

      tail -f ?

      Ça a l'air d'être exactement ce qu'il faut et sans besoin de cron

      Please do not feed the trolls

      • [^] # Re: tail ?

        Posté par (page perso) . Évalué à 3.

        Oui, avec tail -F pour gérer la rotation, que j'utilise déjà.

        J'aime bien aussi l'idée proposée par Marotte, reste à déterminer N :)

        quand au java… je préfère pas, cette VM n'en a pas, alors je vais m'en passer (déjà que j'ai pas tellement de ram à disposition).

        merci

      • [^] # Re: tail ?

        Posté par . Évalué à 1.

        Si le serveur web est apache, tu peux aussi faire directement:

        CustomLog | ta_commande_qui_remet_l'input_dans_ton_fichier_de_log_après_traitement

        Cf http://httpd.apache.org/docs/2.2/logs.html#piped

        • [^] # Re: tail ?

          Posté par (page perso) . Évalué à 2.

          Bonsoir,

          le serveur web tourne avec Nginx.

          J'ai environ une quinzaine de "config" différentes, et heureusement toutes écrivent maintenant dans le même fichier access.log, mais je n'ai pas envie de modifier ces 15 config au risque d'oublier une occurrence quelque part.

          Tout en écrivant cela, je réalise que je peux ajouter une ligne include, et avoir dans le fichier inclus la ligne supplémentaire pour les logs. (ou même les deux lignes pour les deux logs).

          Il se trouve que Piwik accepte plusieurs formats de log, et comme j'ai modifié l'ordre des éléments pour mes logs, il y a des tas de trucs qui passent plus. Piwik n'est pas le seul à accepter une liste de format défini (c'est déjà pas mal). Bien sur, j'aurai pu modifier le script dans Piwik, mais l'exercice de création de nouveau log au format attendu est intéressant.

          Comme je ne veux pas conserver les logs au format standard "vhost", je préfère les générer le temps de m'en servir, puis poubelle.

          Merci
          G

          • [^] # Re: tail ?

            Posté par . Évalué à 2.

            pourquoi t'es oubliger de faire une usine à gaz ?
            Piwik ne peut pas aller lire directement les logs de ngnix par defaut ?
            c'est pas son boulot ?

            • [^] # Re: tail ?

              Posté par (page perso) . Évalué à 1.

              Piwik ne peut pas aller lire directement les logs de nginx par defaut ?

              Bien sur, mais comme j'ai changé l'ordre d'affichage des éléments dans les logs générés par Nginx, Piwik et d'autres logiciels sont déroutés. L'ip et les requêtes sont bien repérés, mais pas le $host par exemple.

              Pour les remettre d'applomb, il faudrait que je change l'ordre ainsi:

              $4 $5 - $13 $2 "$7" $3 $9 "$12" $16

              pour que mes logs correspondent au format vhost.

              Bonne journée
              G

              • [^] # Re: tail ?

                Posté par . Évalué à 3.

                comme j'ai changé l'ordre d'affichage des éléments dans les logs générés par Nginx,

                ben pourquoi tu les remets pas dans l'ordre par defaut pour que piwik puisse taper directement dedans ?
                ou simplement (si piwik le permet) lui donner l'ordre des logs du ngnix customisé

                • [^] # Re: tail ?

                  Posté par (page perso) . Évalué à 1.

                  parce que je préfère l'ordre dans lequel j'ai placé les éléments.

                  • [^] # Re: tail ?

                    Posté par . Évalué à 7.

                    c'est très court comme argument…

                    Je fais partie des gens qui considèrent qu'il faut s'efforcer de conserver les configurations par défaut des logiciels que l'on utilise… Justement pour éviter les problèmes tel que celui que tu rencontres.

                    Tu peux développer ?

                  • [^] # Re: tail ?

                    Posté par . Évalué à 5.

                    sauf à avoir un besoin precis (ex pour un autre logiciel d'analyse qui ne prendrait pas les logs par defaut)
                    je ne vois pas trop pourquoi, hormis la facilité personnelle de lecture, tu as eu besoin de changer l'ordre des choses ?

                    et si c'est juste pour toi, fait toi une moulinette qui change l'affichage du log quand tu le parse, mais laisse l'ordre par defaut que piwik/awstats/webalizer puissent faire leur boulot.

                    ca t'evitera bien des ennuis.

                    • [^] # Re: tail ?

                      Posté par (page perso) . Évalué à 3.

                      Certes, j'aurai du choisir parmi la liste des différents modèles, mais de toute façon j'ai besoin d'ajouter des éléments dans mes fichiers de logs, donc soit je double le nombre de fichiers, soit …

                      au final, puisque je préfère lire les logs avec les éléments dans un ordre, avec mes ajouts, j'ai fait une moulinette qui effectue les transformations pour les autres logiciels:

                      tail -F -n 1 /var/log/nginx/access.log | ./ma_moulinette.awk | log-analyser-piwik...
                      Concernant piwik, il gère déjà la lecture au fur et à mesure de ce qui lui arrive par l'entrée standard, donc je n'ai pas eu besoin de faire quelque chose de compliqué avec des logs temporaires etc.

                      Ma moulinette converti mes log vers le format "common_complete" et c'est parfait.

                      Bonne soirée
                      Merci à tous
                      G

  • # Salut

    Posté par . Évalué à 3.

    Tu récupères les N dernières lignes avec N assez grand pour ne pas rater de ligne, puis tu traites la dernière ligne récupérée, puis celle juste avant tant que l'horodatage n'est pas inférieur à celui de la dernière ligne traitée (à la précédente exécution). Cela implique de conserver le dernier horodatage traité entre deux exécutions.

    Sinon en déjà fait j'entends parler de logstash mais il me semble que c'est assez lourd à mettre en œuvre (Java inside)

    • [^] # Re: Salut

      Posté par . Évalué à 2. Dernière modification le 28/07/14 à 17:46.

      Un cas limite: je pense qu'il ne faut pas traiter le tout dernier horodatage car il se pourrait qu'un ligne vienne se rajouter avec le même horodatage et dans ce cas, elle ne sera pas prise par la prochaine itération.

  • # Avec perl et File::Tail

    Posté par (page perso) . Évalué à 3.

    Avec perl et File::Tail

    resetafter permet de se reconnecter après rotation des log,

    il faut juste écrire le parser

    Exemple :

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use File::Tail;
    
    my $file = $ARGV[0];
    
    die $! if ! -f $file;
    
    my $logfile=File::Tail->new(name => $file, resetafter => 300);
    
    while (defined(my $l=$logfile->read)) {
        parse_line($l);
    }

    ça tourne tout seul pendant des mois

    • [^] # Re: Avec perl et File::Tail

      Posté par (page perso) . Évalué à 2.

      J'étais en train de réfléchir à un script qui allait compter le nombre lignes traitées, et écrire ce nombre dans fichier, pour faire la comparaison à la prochaine passe avec éventuellement une lecture du fichier qui serait en log.1

      ça m'a lair bien plus simple ce script en perl…

      Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.