Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Script Bash] Analyse fichiers log

Sujet résolu
    22 juillet 2016 à 11:50:35

    Bonjour à tous,

    Ce matin je manque d'idée sur le petit problème que je dois résoudre.

    L'équipement sur lequel je travaille génère des fichiers de logs, que j'aimerai analyser

    J'ai besoin d'un script qui me sort le nombre de fois (donc nombre de lignes) où le mot clé "Update_fail" est présent.

    Jusque là ça va, MAIS je ne dois m'intéresser qu'aux lignes vielles de 15 minutes maximum !

    ET en plus, je ne sais pas sur combien de fichier de log je dois travailler (exemple : si il y a beaucoup de logs et bien .log sera vite rempli et donc je dois aussi regarder le fichier .log1, .log2, .log3 etc ...)

    Merci pour votre aide :s

    (Mon plus gros problème est vraiment la gestion de ce "Quart d'heure d'ancienneté", j'ai pensé transformer en minutes et vérifier que date_actu - date_log < 15*60 mais pour les logs proches de minuit ça poserai problème ... Bref, need help )

    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2016 à 14:23:31

      salut,

      on peut avoir quelques lignes d'échantillon pour observer le format à traiter ?

      a priori, j'utiliserais Gawk, qui dispose de fonctions de date pour convertir les dates au format secondes depuis Epoch.

      -
      Edité par dantonq 22 juillet 2016 à 14:25:01

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        22 juillet 2016 à 15:29:58

        Salut,

        Merci pour ta réponse

        J'en suis là : J'ai un fichier contenant ce genre de ligne : "2016/06/19-00:09:48,815+02:00 hostname" qui m'indique que le 2016/06/19 à 00:09:48 l'équipement hostname a envoyé un "Update_fail"

        donc bien sûr le champ intéressant est ici : 00:09:48

        Il me manque de comparer ma date actu avec ce 00:09:48 pour savoir si ce log est plus ou moins ancien d'1/4 d'H ...

        Merci !!

        • Partager sur Facebook
        • Partager sur Twitter
          22 juillet 2016 à 15:50:18

          pour t'avancer un peu :
          $ echo "2016/06/19-00:09:48,815+02:00 hostname" \
             | gawk '{split($1,ar,","); gsub("[/:-]"," ",ar[1]); val2compare=mktime(ar[1]); print val2compare}'
          1466287788


          tu dois encore retrancher la valeur stockée à systime(), et tester si le résultat est inférieur ou égal à 15.

          -
          Edité par dantonq 22 juillet 2016 à 15:51:33

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            22 juillet 2016 à 16:14:40

            Cool !

            J'ai testé sur un Linux, ta commande marche mais m'affiche "1466287788" et je ne comprends pas tellement à quoi cette valeur correspond ...

            De toute façon, l'équipement en question ne reconnait pas "gawk" par contre "awk"ou "nwak" oui !

            (Impossible d'installer quoi que se soit)

            Je travaille aussi de mon côté et j'ai un problème pour convertire mon HH:MM:SS en secondes car dans cette commande :

            date_actu=`date +%H:%M:%S`
            
            date_actu_in_sec=`$(($((`echo ${date_actu#0} | cut -d ":" -f 1`*60*60))+$((`echo ${date_actu#0} | cut -d ":" -f 2`*60))+`echo ${date_actu#0} | cut -d ":" -f 3`))`

            (Je coupe suivant les ":" et multiplie par 60^n suivant l'unitée)

            Mais à cause des `` qui se croisent la commande ne marche pas car le deuxième ` ferme le premier directement ...

            Je suis obligé de passer par trois variables ?

            [EDIT]

            Oups ! Rien à voir avec le croisement des `` puisqu'il n'en faut pas au début et à la fin !

            Comme cela, tout va mieux :

            date_actu_in_sec=$(($((`date +%H`*60*60))+$((`date +%M`*60))+`date +%S`))




            -
            Edité par GuiGui_69100 22 juillet 2016 à 16:36:33

            • Partager sur Facebook
            • Partager sur Twitter
              22 juillet 2016 à 16:38:01

              Mais à cause des `` qui se croisent la commande ne marche pas car le deuxième ` ferme le premier directement ...

              c'est pourquoi cette forme est ± considérée comme obsolète, tant elle est peu pratique.

              $ dateActu=$(date +'%H:%M:%S')
              $ date -d "$dateActu" +%s

              mais, tu dois prendre la date aussi, pas seulement l'heure ! sinon, comme tu le disais, à minuit, Cendrillon : ça ne fonctionnera plus. :(

              -
              Edité par dantonq 22 juillet 2016 à 16:39:03

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                22 juillet 2016 à 17:23:24

                Ce script est destiné à être lancé périodiquement toutes les 15min donc oui, il sera forcement lancé à minuit ...

                $ dateActu=$(date +'%H:%M:%S')
                $ date -d "$dateActu" +%s

                Me donne le nombre de secondes écoulées entre 1970-01-01 00:00:00 et date +'%H:%M:%S' c'est exact ? Donc d'une simple soustraction j'ai mon delta temps ?

                Pour le "problème minuit" tout serait reglé du coup non ?

                Merci

                [EDIT] Grrrr, -d n'est pas reconnu comme option de la commande date sur l'équipement en question ....

                -
                Edité par GuiGui_69100 22 juillet 2016 à 17:36:13

                • Partager sur Facebook
                • Partager sur Twitter
                  22 juillet 2016 à 17:52:54

                  non, le problème n'est pas lié à l'heure d'exécution du script, mais des données utilisées par la commande date:
                  $ echo $(($(date -d "2016/07/23 00:01" +%s) - $(date -d "2016/07/22 23:59" +%s) ))
                  120
                  $ echo $(($(date -d "00:01" +%s) - $(date -d "23:59" +%s) ))
                  -86280

                  par défaut, date utilise la date du jour, il faut donc lui indiquer la date à prendre en compte !

                  edit:
                  c'est quoi ton équipement ?

                  -
                  Edité par dantonq 22 juillet 2016 à 17:53:51

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    22 juillet 2016 à 18:00:28

                    Ok là c'est exactement ce qu'il me faut ! Si je récupère ma date actuelle au format AAAA/MM/DD HH:MM et sous le même format mon heure dans le fichier de log je suis ok !

                    Reste plus que ce problème d'option -d qui ne marche pas ...

                    (Je travaille sur une plateforme où sont interconnectés plusieurs serveurs. En demandant à certains collègues, la société qui supervise ces serveurs ne nous laisse pas toutes les commandes à dispo'.)

                    # uname -a

                    SunOS [HOSTNAME] 5.10 Generic_150400-26 sun4v sparc SUNW,Netra-T5440

                    Donc Solaris avec des commandes surement en moins -.-

                    -
                    Edité par GuiGui_69100 22 juillet 2016 à 18:09:38

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juillet 2016 à 18:08:41

                      je viens de parcourir le man de nawk : il dispose aussi de fonctions date...

                      mais peut-être pas sur SunOS :euh:

                      -
                      Edité par dantonq 22 juillet 2016 à 18:09:40

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                        25 juillet 2016 à 9:43:58

                        Hello !

                        Je ne suis pas le seul sur Solaris avec ce problème finalement !

                        En fouillant un peu, je suis tombé sur ce forum : http://www.unix.com/shell-programming-and-scripting/115449-how-convert-date-time-epoch-time-solaris.html

                        Qui dirige aussi sur cette aide : http://www.epochconverter.com/

                        Et finalement, une fonction très utile est donnée sur ce site : http://stackoverflow.com/questions/18868838/convert-a-given-time-to-seconds-in-solaris

                        Je vais essayer de faire avec cette fonction, je crois qu'elle correspond à mes attentes

                        Merci encore pour tout :D

                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Script Bash] Analyse fichiers log

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown