Aide script pour parser les logs

michel -  
 michel -
Bonjour,

Je suis actuellement bloqué dans mon script, j'ai crée un script shell qui vient parser les logs de Tomcat6 et Apache, jusque là tout va bien. Je rajoute mon script dans un cron pour qu'il s'exécute toutes les heures > OK.

Le problème s'est que mon script me renvoie toutes les heures, la même erreur pour les logs d'Apache alors que l'erreur est arrivé hier dans la journée, je voudrais faire en sorte que mon script me renvoie pas tout le temps même erreur.

Est-ce possible.

Merci d'avance, j'espère avoir été clair.

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Peut-être qu'avec un exemple de log (tout le monde n'a pas de log d'Apache et Tomcat sous la main) et le détail de ton script, nous serions plus à même de t'aider, non ? ;-\
    0
    1. michel
       
      C'est vrai autant pour moi :

      ## VARIABLES ##
      LOG="/var/log/tomcat6/catalina.out"
      LOG1="/var/log/httpd/error_log"
      SYSTEM='hostname'
      MAIL=monemail
      GREP=$(tail -n 200 $LOG | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*")
      GREP1=$(tail -n 50 $LOG1 | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*")
      
      ## Parser TOMCAT6 ##
      
              if [ -z "$GREP" ]
      then
           echo "pas d'erreur dans les logs"
      else
           echo "$GREP" | mail -s "Erreur critique sur l'application TOMCAT6 de $SYSTEM" $MAIL
      
              fi
      
      ## Parser HTTPD ##
      
               if [ -z "$GREP1" ]
      then
            echo "pas d'erreur dans les logs"
      else
            echo "$GREP1" | mail -s "Erreur critique sur l'application HTTPD de $SYSTEM" $MAIL
      
               fi
      


      Exemple de log tomcat :
      java.lang.Exception: Ce numero de carte de fidélité a déjà été affecté à un client
      at cce.house.services.GbFidCard.addFidCard(GbFidCard.java:133)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
      at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
      at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
      at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:95)
      at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
      at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
      at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
      at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
      at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:295)
      at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:515)
      at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:285)
      at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:143)
      at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:155)
      at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:189)
      at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:76)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
      at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
      at java.lang.Thread.run(Thread.java:619)

      Exemple de log Apache :

      [Tue Jan 28 16:48:49 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header

      Merci à vous,
      0
  2. Utilisateur anonyme
     
    salut,

    il faut faire en sorte de parser uniquement les lignes ajoutées depuis la précédente lecture, et donc il faut inscrire dans un fichier annexe le nombre de lignes du fichier log.
    il faut aussi tenir compte du renouvellement du fichier log !
    0
    1. michel
       
      peux-tu être plus précis par un exemple si possible.

      Merci d'avance,
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Re-

    Pour Apache, tu pourrais rajouter dans ton
    grep
    la date du jour :

    $ cat plop 
    [Tue Jan 28 16:48:49 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
    [Wed Jan 29 16:48:49 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header

    $ jour=$(LANG=en_GB date "+%a %b %d")

    $ grep -i "^\[${jour}.*\(Fatal\|Error\|Exception\|at.*\.java\:.*\)" plop
    [Wed Jan 29 16:48:49 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header


    Pour Tomcat, je suis d'accord avec QQCQCPQ ;-))
    0
    1. michel
       
      Merci zipe31 de ta réponse, je pense qu'il manque la fermeture de crochet non ? ;)
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Non non ;-))
      0
    3. michel
       
      Je viens de tester pour Apache avec cette ligne la :
      grep -i "^\[${jour}.*\(Fatal\|Error\|Exception\|at.*\.java\:.*\)"

      il me renvoi la même chose qu'avant.

      c'est à dire

      [Mon Jan 27 14:39:43 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:40:38 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:40:46 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:40:50 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:41:00 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:41:10 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:42:00 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:43:08 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:44:56 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Mon Jan 27 14:47:31 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
      [Tue Jan 28 16:48:49 2014] [error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header

      Je devrais rien à voir normalement.
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      La variable
      ${jour}
      contient bien Wed Jan 29 ?
      0
    5. michel
       
      le resultat de la variable $jour est : Wed Jan 29
      0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Pour Tomcat j'ai peut-être une combine...

    L'idée c'est d'avoir un fichier temporaire où sont stockées les données et de se servir de ce fichier pour éliminer les données déjà traitées.

    Concrètement, il faut un premier fichier de référence :

    grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*" > fich.temp

    Puis au fur et à mesure compléter ce fichier avec les nouvelles entrées (
    tee -a fich.temp
    ), mais ne garder que ces entrées pour le mail (
    grep -v -f  fich.temp
    )...

     
    grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*" | grep -v -f  fich.temp | tee -a fich.temp
     

    Exemple en pratique...

    Le fichier de départ pour tomcat :
    $ cat brol 
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter

    Construction du fichier temporaire de base :
    $ grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*" brol > tmp.log

    Son contenu :
    $ cat tmp.log 
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

    Maintenant je rajoute 2 nouvelles entrées en fin de fichier :
    $ cat brol 
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
    at java.lang.reflect.Method.invoke(Method.java:1597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1629)

    Je lance la commande de parsage (qui ne me sort bien que les 2 nouvelles lignes) :
    $ grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*" brol | grep -v -f tmp.log | tee -a tmp.log 
    at java.lang.reflect.Method.invoke(Method.java:1597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1629)

    Et mon fichier temporaire contient bien mes 2 nouvelles entrées :
    $ cat tmp.log 
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at java.lang.reflect.Method.invoke(Method.java:1597)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1629)


    A toi d'adapter en fonction de tes besoins...
    0
    1. michel
       
      ok je suis un peu perdu dans ton raisonnement.
      J'ai mon fichier de log :
      /var/log/tomcat6/catalina.out

      ma commande qui vient récupérer la stack qui m'intéresse :
      tail -n 200 /var/log/tomcat6/catalina.ou | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*"

      Je construis ensuite mon fichier temp de base :
      tail -n 200 /var/log/tomcat6/catalina.ou | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*" > tmp.log

      et ensuite je ne comprends pas comment tu rajoutes les deux ou plusieurs lignes ??

      et ta dernière commande vient récupérer les deux ou plusieurs lignes précédemment ajoutées.

      Merci,
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      et ensuite je ne comprends pas comment tu rajoutes les deux ou plusieurs lignes ??
      Grâce à
      | grep -v -f tmp.log | tee -a tmp.log 
      qui exclue tout le contenu du fichier de tmp.log (
      grep -v -f tmp.log
      ) avant d'y rajouter les nouvelles entrées (
      tee -a tmp.log
      ).

      Ta commande sera :

      tail -n 200 /var/log/tomcat6/catalina.ou | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*"  | grep -v -f tmp.log | tee -a tmp.log 
      0
    3. michel
       
      ok nickel merci de ta réponse :

      dernière question, pour les logs de tomcat, j'arrive à récupérer la stack mais pas correctement :
      tail -n 200 /var/log/tomcat6/catalina.ou | grep -i "Fatal\|Error\|Exception\|at.*\.java\:.*"

      Le problème s'est que je récupère une stack complet mais desfois je récupère la fin d'une stack précédente, je souhaite que mes stacks soit toujours propre. Je sais que tail -n y est pour quelque chose mais je ne trouve pas le moyen de récupérer à chaque coup une stack complète

      Pour exemple :

           at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
      at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
      at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
      at java.lang.Thread.run(Thread.java:619)
      GRAVE: "Servlet.service()" pour la servlet jsp a généré une exception
      java.lang.NumberFormatException: For input string: ""
      at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
      at java.lang.Integer.parseInt(Integer.java:456)
      at java.lang.Integer.parseInt(Integer.java:497)
      at org.apache.jsp.catalogue3_jsp._jspService(catalogue3_jsp.java:116)
      at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
      at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
      at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
      at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
      at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
      at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
      at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
      at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
      at java.lang.Thread.run(Thread.java:619
      )
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Euh... je ne connais pas du tout le fonctionnement de Tomcat, mais après une rapide recherche sur le net, je m'aperçois qu'on peut loguer les erreurs en y rajoutant un timestamp...

      Peut être devrais-tu activer cette possibilité (voir ce thread), cela faciliterait grandement la tâche, non ?
      0
    5. michel
       
      oui c'est clair, je vais regarder çà
      0