#!⌨

OpenERP et le logging

Mon ami Sylvain, qui travaille avec OpenERP au sein de sa coopérative GRAP me demandait comment modifier le logging dans OpenERP et notamment recevoir des mails lorsqu'OpenERP était en erreur.

Sur le coup, je me suis dit que c'était simple, car Python possède le module logging et il est donc très simple de configurer le logging à sa manière. Cependant, les options d'OpenERP ne permettent pas de modifier les options de logging.

Pour mémoire, voici les options qu'on peut passer à openerp-server (ne cherchez pas la doc, je suis allé voir le code) :
  • --logfile  : fichier de log
  • --no-log-rotate  : ne pas faire tourner le fichier de log
  • --syslog  : envoyer le log vers syslog
  • --log-handler  : permet de définir le niveau de log par logger (exemple : --log-handler=openerp.orm:DEBUG permet de logger les messages de criticité DEBUG pour le logger openerp.orm)
  • --log-request  : raccourci pour l'option précédente et le logger openerp.netsvc.rpc.request. --log-handler=openerp.netsvc.rpc.request:DEBUG est équivalent à --log-request DEBUG.
  • --log-response  : raccourci pour --log-handler et le logger openerp.netsvc.rpc.response
  • --log-web  : raccourci pour --log-handler et le logger openerp.addons.web.http
  • --log-sql  : raccourci pour --log-handler et le logger openerp.sql_db
  • --log-level  : défini le niveau de logging global. Cette option est dépréciée.

En résumé, pour la configuration du logging, OpenERP propose deux options : soit passer par une surcouche au module logging qui limite beaucoup les possibilités, soit passer par syslog.

Pour répondre à notre problématique, on doit donc passer par syslog. Pour ce faire, nous avons besoin de modifier le script de lancement d'OpenERP. Dans mon cas, j'utilise un package fourni pour Ubuntu 12.04 par l'éditeur. Je doit donc modifier le fichier /etc/init.d/openerp et remplacer l'option --logfile=$LOGFILE par --syslog. Il faut alors redémarrer le démon openerp. Vu que nous avons modifié le script d'init, nous devons forcer un arrêt complet du service : service openerp stop && service openerp start. En effet, utiliser service openerp restart ne prend pas en compte les modifications qui viennent d'être effectuées.

La deuxième étape consiste à configurer rsyslog pour faire en sorte que nos message finissent dans leur propre fichier et non dans /var/log/syslog. Je configure donc rsyslog pour logger tous les messages dans /var/log/openerp/openerp-syslog.log et les messages d'erreur dans /var/log/openerp/openerp-syslog.err. Voici un extrait de mon fichier /etc/rsyslog.d/20-openerp.conf  :

# définition de la structure d'une ligne de log
$template OpenErpTemplate,"\n%timereported% %HOSTNAME% [%syslogseverity-text%] %msg%"

# si la propriété programname est égale à "OpenERP"
# alors on loggue dans /var/log/openerp/openerp-syslog.log
:programname,isequal,"OpenERP" /var/log/openerp/openerp-syslog.log;OpenErpTemplate

# si la propriété programname est égale à "OpenERP" et que le message
# est un message d'erreur ou plus critique, alors on loggue dans
# /var/log/openerp/openerp-syslog.err
if $programname == 'OpenERP' and $syslogseverity <= '3' then /var/log/openerp/openerp-syslog.err;OpenErpTemplate

# on invalide tous les messages dont la propriété programname est égale
# à "OpenERP" afin qu'ils ne se retrouvent pas dans /var/log/syslog
:programname,isequal,"OpenERP" ~

On redémarre rsyslog et on profite de notre nouveau système de log : service restart rsyslog && tail -f /var/log/openerp/openerp-syslog.log.

Concernant notre problématique de recevoir des mails lors du log d'erreurs, on pourra alors utiliser le module ommail pour rsyslog ou exécuter un script.

Vous pourrez retrouver cette configuration de rsyslog comme tâche fabric pour ma machine virtuelle openerp.