{"id":120,"date":"2008-09-13T12:24:28","date_gmt":"2008-09-13T10:24:28","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=120"},"modified":"2008-09-13T15:27:03","modified_gmt":"2008-09-13T13:27:03","slug":"utiliser-ses-propres-journaux-devenements","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/09\/utiliser-ses-propres-journaux-devenements\/","title":{"rendered":"Utiliser ses propres journaux d&rsquo;\u00e9v\u00e9nements"},"content":{"rendered":"<p>Sous Linux, les journaux d&rsquo;\u00e9v\u00e9nements (log en anglais) sont centralis\u00e9s. il y a un daemon <em>syslogd<\/em> qui impl\u00e9mente le protocole <em>syslog<\/em> et g\u00e8re les diff\u00e9rents fichiers de log du syst\u00e8me.<br \/>\nCes fichiers sont tr\u00e8s important pour r\u00e9soudre des probl\u00e8mes de fonctionnement ou de plantage.<br \/>\nMa question du jour est: est-il possible d&rsquo;utiliser cette facilit\u00e9 pour ses propres scripts ou programmes? Ce que je veux c&rsquo;est un fichier .log qui ne soit utilis\u00e9 que par mes programmes et qui soit situ\u00e9, comme tous les autres fichiers de log du syst\u00e8me, dans le r\u00e9pertoire <em>\/var\/log<\/em>.<\/p>\n<p>Sans entrer dans les d\u00e9tails du fichier <em>\/etc\/syslog.conf<\/em>, il existe un certain nombre de fichiers standards comme par exemple (extrait du fichier <em>\/etc\/syslog.conf<\/em>):<\/p>\n<pre class=\"codesource\">\r\nkern.*\t\t\t\t-\/var\/log\/kern.log\r\nmail.info\t\t\t-\/var\/log\/mail.info\r\nnews.crit\t\t\t\/var\/log\/news\/news.crit\r\n<\/pre>\n<p>On peut voir par exemple que les \u00e9v\u00e9nements concernant le mail sont \u00e9crits dans le fichier <em>\/var\/log\/mail.log<\/em>. Le protocole <em>syslog<\/em> d\u00e9finit un certain nombres de facilit\u00e9s (facility). vous en voyez des exemples ici: mail, kern, lpr, user,news,&#8230; et huit priorit\u00e9s (priority) diff\u00e9rentes:<\/p>\n<ul>\n<li> Emerg (emergency)\n<li> Alert\n<li> Crit (critical)<\/li>\n<li> Err (error)<\/li>\n<li> Warning<\/li>\n<li> Notice<\/li>\n<li> Info<\/li>\n<li> Debug<\/li>\n<\/ul>\n<p>l&rsquo;ast\u00e9risque dans le couple <em>facility.priority<\/em> signifie que le fichier utilis\u00e9 doit \u00eatre celui qui est sp\u00e9cifi\u00e9 peu importe le niveau de priorit\u00e9.<\/p>\n<p>Ce qui nous int\u00e9resse, c&rsquo;est qu&rsquo;il existe huit facilit\u00e9s d\u00e9finissables par l&rsquo;utilisateur ou par tout programme pour lequel il n&rsquo;existerait pas de facilit\u00e9 par d\u00e9faut dans syslog. Il s&rsquo;agit des facilit\u00e9s <em>local0<\/em> \u00e0 <em>local7<\/em>. Autrement dit, il nous suffit d&rsquo;ajouter dans le fichier <em>\/etc\/syslog.conf<\/em> une ligne du genre:<\/p>\n<pre class=\"codesource\">\r\nlocal0.*\t\t\t-\/var\/log\/michel.log\r\n<\/pre>\n<p>Je ne sp\u00e9cifie pas de priorit\u00e9 et le fichier dans lequel les \u00e9v\u00e9nements sont \u00e9crits doit \u00eatre <em>\/var\/log\/michel.log<\/em>. le <em>&#8211;<\/em> devant signifie que les messages ne doivent pas n\u00e9cessairement \u00eatre \u00e9crits directement dans le fichier mais que leur \u00e9criture peut \u00eatre diff\u00e9r\u00e9e. Ceci n&rsquo;a d&rsquo;importance que pour des messages vraiment critiques qui en cas de plantage pourraient ne pas \u00eatre \u00e9crits dans le fichier de log.<\/p>\n<p>Ok, il reste une petite chose \u00e0 faire: relancer le daemon <em>syslogd<\/em> pour que nos changements dans le fichier <em>\/etc\/syslog.conf<\/em> soit pris en compte:<\/p>\n<pre class=\"codesource\">\r\n$ sudo \/etc\/init.d\/sysklogd restart\r\n<\/pre>\n<p>Maintenant nous sommes pr\u00eats \u00e0 \u00e9crire nos messages dans le fichier de log <em>\/var\/log\/michel.log<\/em> comme nous le voulions. Mais comment faire?<\/p>\n<p>Dans un script shell, c&rsquo;est facile, il existe une commande qui permet d&rsquo;\u00e9crire dans un fichier de log:<\/p>\n<pre class=\"codesource\">\r\n$ logger -p local0.notice -t TEST Test de log\r\n<\/pre>\n<p>le switch <em>-p<\/em> sp\u00e9cifie le couple facilit\u00e9.priorit\u00e9. La priorit\u00e9 n&rsquo;a pas d&rsquo;importance pour nous.<br \/>\nle <em>-t<\/em> sp\u00e9cifie un tag que l&rsquo;on peut afficher au d\u00e9but du message, le nom du programme qui a g\u00e9n\u00e9r\u00e9 le message par exemple.<br \/>\nLe r\u00e9sultat de la commande se trouve donc dans le fichier <em>\/var\/log\/michel.log<\/em> comme voulu:<\/p>\n<pre class=\"codesource\">\r\n$ more \/var\/log\/michel.log\r\nSep 13 09:48:26 LinuxPC TEST: Test de log\r\n<\/pre>\n<p>Faire la m\u00eame chose dans un programme \u00e9crit en python est \u00e0 peine plus compliqu\u00e9:<\/p>\n<pre class=\"codesource\">\r\n#!\/usr\/bin\/env python\r\n\r\nimport syslog\r\n\r\nsyslog.openlog('TEST', 0, syslog.LOG_LOCAL0)\r\nsyslog.syslog(syslog.LOG_INFO,'Test de log en python')\r\nsyslog.closelog()\r\n<\/pre>\n<p>Je vous invite \u00e0 jeter un oeil \u00e0 la documentation du module syslog pour conna\u00eetre les diff\u00e9rentes constantes utilisables.<\/p>\n<p>Voici la m\u00eame chose en C++:<\/p>\n<pre class=\"codesource\">\r\n# include &lt;string&gt;\r\n# include &lt;syslog.h&gt;\r\n\r\nint main()\r\n{\r\n  std::string message = \"TEST\";\r\n  openlog(message.c_str(), 0, LOG_LOCAL0);\r\n  syslog(LOG_INFO,\"Test de log en C++\");\r\n  closelog();\r\n  return EXIT_SUCCESS;\r\n}\r\n<\/pre>\n<p>Un conseil, abusez des fichiers de log dans vos scripts et vos programmes. Je vous assure que cela rend de grand services en cas de probl\u00e8me. C&rsquo;est d&rsquo;autant plus vrai si vous distribuez vos programmes parce que c&rsquo;est toujours sur une autre machine que la v\u00f4tre que les plantages arrivent et vous serez content que votre client puisse vous envoyer le fichier de log de votre programme.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sous Linux, les journaux d&rsquo;\u00e9v\u00e9nements (log en anglais) sont centralis\u00e9s. il y a un daemon syslogd qui impl\u00e9mente le protocole syslog et g\u00e8re les diff\u00e9rents fichiers de log du syst\u00e8me. Ces fichiers sont tr\u00e8s important pour r\u00e9soudre des probl\u00e8mes de fonctionnement ou de plantage. Ma question du jour est: est-il possible d&rsquo;utiliser cette facilit\u00e9 pour [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,15,5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/120"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=120"}],"version-history":[{"count":13,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/120\/revisions"}],"predecessor-version":[{"id":132,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/120\/revisions\/132"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}