Styles

dimanche 12 octobre 2008

La journalisation n'est pas neutre

Je viens de lire ça sur le blog de Miško Hevery dans son billet Root Cause of Singletons :
The other kind of Singletons, which are semi-acceptable are those which don’t effect the execution of your code. Logging is perfect example. It is loaded with Singletons and global state. It is acceptable (as in it will not hurt you) because your application does not behave any different whether or not a given logger is enabled.
Non, non, non, comment peut-on dire qu'une application n'est pas affectée par l'exécution ou non d'un code dont elle dépend, surtout un système de journalisation (Logger). Un logger peut amener un tas de problèmes. Il suffit de jeter un coup d'oeil sur les changements effectués sur la dernière version stable de log4j par exemple pour prendre peur : une cinquantaine de bugs fixés il y a plus d'un an et pas de release stable officielle depuis malgré une quarantaine de bugs ouverts...

Mais sans parler des bugs, si on réfléchi un minimum à ce que peut faire un Logger comme log4j, on s'aperçoit que, oui, votre application peut avoir un comportement différent simplement du fait de sa dépendance au Logger:

- le logger peut écrire dans un fichier qui peut exploser le disque sur lequel votre application souhaite y écrire des données

- le logger peut écrire dans une base de données et s'arroger pour un temps incertain des connexions qui sont normalement allouées à l'application

- vous ne maitrisez aucunement le temps que passe le Logger à réaliser sa tâche (je vous conseille dans tous les cas, d'utiliser un système de logging asynchrone qui vous rend la main aussi vite que possible. Sous log4j, c'est AsyncAppender qui se charge de ça)

Dans tous les cas, il est important de savoir ce que fait exactement le logger, car le logging est peut-être l'activité la plus répétitive et la plus longue que va réaliser votre programme. Si vous ne voulez pas avoir la désagréable sensation d'être revenu au temps préhistorique (c'est-à-dire, comme sur une machine de plus de 3 ans) quand vous exécutez votre programme, ne laissez pas votre logger vous bouffer. Des systèmes comme Oracle Database Server ont poussé l'expertise jusqu'à en faire une science quasi-exacte ;)
Toute ligne de code a un impact sur l'exécution. J'ai bien dit "Toute ligne de code", même celles qui théoriquement ne seront jamais appelées. Ça m'est déjà arrivé avec du code Visual Basic 6, il y a for longtemps il est vrai, mais c'est une expérience que je ne souhaite absolument pas renouveler...

Aucun commentaire: