Log post mortem avec Python | Sam & Max: Python, Django, Git et du cul

Log post mortem avec Python

Il y a des mois de ça, j’avais écris un article sur atexit, un module qui permet de lancer une fonction à la fermeture de la VM Python.

Ces fonctions sont appelées même si la VM s’arrête brutalement, mais on a aucune information sur la raison de l’arrêt de la machine virtuelle Python. Et elles sont exécutées même si tout s’est bien passé.

Si vous voulez réagir au plantage de votre programme, et seulement au plantage, tout en ayant en plus des informations sur la nature du foinage :

import sys

def on_crash(type, value, tb):
    print type
    print value
    print tb

sys.excepthook = on_crash

declencher_erreur = 1 + "1"

## 
## unsupported operand type(s) for +: 'int' and 'str'
## 

Ca peut être très intéressant pour débugger un processus détaché comme par exemple votre serveur WSGI qui fait tourner Django qui décide de se petit-suicider : demandez à sys.excepthook de faire un dump de l’exception dans un fichier log , et vous pourrez voir ce qui a propoqué la crise.

Si vous êtes du genre poli, vous voudrez quand même garder l’ancien comportement de sys.excepthook, qui est toujours disponible depuis sys.__excepthook__ :

def on_crash(type, value, tb):
    # faire ce que vous voulez ici puis...
    sys.__excepthook__(type, value, tb)

Et dire que vous commenciez à croire que vous saviez presque tout sur Python. Mouarf.

  8 comments for “Log post mortem avec Python

  1. Etienne
    07/03/2013 at 13:21

    J’ai utilisé ce mécanisme en association avec logging pour m’envoyer un mail en cas d’événement critique.

    Ce qui en passant m’a amené overrider SMTPHandler de loggin.handlers qui avait un problème avec l’encodage (@kontre): ce con ne connaissant que l’ascii, je l’ai adapté pour qu’il accepte de l’unicode et sorte de l’utf-8 dans le sujet et le corps du message.

    J’ai pas mal appris en 6 mois, mine de rien (clap, clap, clap! Bravo Etienne)

  2. Sam
    07/03/2013 at 14:04

    Ce sujet m’intéresse. Y aurait moyen que tu nous fasse pêter le code source (ou si tu as le temps, carrément un article ?).

    En particulier la partie SMTP avec le bug et tout le bordel.

  3. Etienne
    07/03/2013 at 15:00

    Ok, je verrai ça demain

  4. Stéphane Bunel
    07/03/2013 at 16:19

    Pourquoi la coloration syntaxique met-elle en vert l’argument ou la variable “type” dans les exemples de code ?

    Parce que “type” est une méthode built-in. Pour éviter de l’écraser, utilisez un autre nom ou “_type” comme on le voit souvent. Cela évitera de chercher des heures pourquoi type(value) is not callable.

  5. Sam
    07/03/2013 at 16:49

    En fait pour faire ça proprement il faudrait appeler les argument “etype” et “evalue” qui sont les noms des arguments de la fonction originale.

  6. 08/03/2013 at 14:45

    Raaaaah mais c’est excellent !!
    En effet, avec ça toute erreur non échappée va tomber dans ma boite mail (ou un ptit sqlite en partage), géniaaaal.
    Vais me faire spammer par tout le studio^^.

    Ah bah non, fallait que le logiciel à 8K qui bind mon python ne le permette pas (je cherche encore la raison)…
    CHIENNE de vie.

  7. Sam
    08/03/2013 at 14:56

    8Ko ou 8k€ ?

  8. 08/03/2013 at 15:25

    nieuros, mais je suis taquin, “ils” nous font payer 1000 boules la “feature” license flottante.
    Bad mood inside^^.
    A côté de ça, Blender est en python3, LUI *soupire*.

Leave a Reply

Your email address will not be published. Required fields are marked *