Aide script pour parser les logs
michel
-
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.
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:
- Aide script pour parser les logs
- View recovery logs - Guide
- Script vidéo youtube - Guide
- Ghost script - Télécharger - Polices de caractères
- Mas script - Accueil - Windows
- Aide au logement - Guide
4 réponses
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 ? ;-\
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 ? ;-\
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 !
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 !
Re-
Pour Apache, tu pourrais rajouter dans ton
Pour Tomcat, je suis d'accord avec QQCQCPQ ;-))
Pour Apache, tu pourrais rajouter dans ton
grepla 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 ;-))
Je viens de tester pour Apache avec cette ligne la :
il me renvoi la même chose qu'avant.
c'est à dire
Je devrais rien à voir normalement.
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.
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 :
Puis au fur et à mesure compléter ce fichier avec les nouvelles entrées (
Exemple en pratique...
Le fichier de départ pour tomcat :
Construction du fichier temporaire de base :
Son contenu :
Maintenant je rajoute 2 nouvelles entrées en fin de fichier :
Je lance la commande de parsage (qui ne me sort bien que les 2 nouvelles lignes) :
Et mon fichier temporaire contient bien mes 2 nouvelles entrées :
A toi d'adapter en fonction de tes besoins...
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...
ok je suis un peu perdu dans ton raisonnement.
J'ai mon fichier de log :
ma commande qui vient récupérer la stack qui m'intéresse :
Je construis ensuite mon fichier temp de base :
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,
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,
et ensuite je ne comprends pas comment tu rajoutes les deux ou plusieurs lignes ??Grâce à
| grep -v -f tmp.log | tee -a tmp.logqui 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
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 :
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 :
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)
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 ?
Peut être devrais-tu activer cette possibilité (voir ce thread), cela faciliterait grandement la tâche, non ?
Exemple de log tomcat :
Exemple de log Apache :
Merci à vous,