Aide script pour parser les logs

Fermé
michel - 29 janv. 2014 à 11:38
 michel - 30 janv. 2014 à 14:08
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.


A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 11:41
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
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
Utilisateur anonyme
29 janv. 2014 à 12:59
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
peux-tu être plus précis par un exemple si possible.

Merci d'avance,
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 13:19
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
Merci zipe31 de ta réponse, je pense qu'il manque la fermeture de crochet non ? ;)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 14:36
Non non ;-))
0
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 14:56
La variable
${jour}
contient bien Wed Jan 29 ?
0
le resultat de la variable $jour est : Wed Jan 29
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 14:08
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
29 janv. 2014 à 17:53
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
30 janv. 2014 à 10:13
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
oui c'est clair, je vais regarder çà
0