C# : Logger en Debug dans une bibliothèque de classes compilée en Release
Aujourd’huis, je devais livrer une bibliothèque de classes qui permettait de logger des actions uniquement en DEBUG.
Or, je devais livrer le code compilé Release. Quand on livre un package nuget celui ci doit être optimisé, on ne peut pas se permettre de livrer en DEBUG.
La problématique :
Si j’appelle directement la méthode Debug.WriteLine de la manière suivante :
1
|
Debug.WriteLine( "debug" ); |
La méthode fonctionne en DEBUG, mais en RELEASE plus rien n’est loggé.
Si on jette un coup d’œil à l’implémentation on s’aperçoit que la méthode a un attribut [Conditional(“DEBUG”)]. Cet attribut permet de dire au compilateur de ne pas compiler la méthode si la constante DEBUG n’existe pas.
Une solution possible :
Une autre façon serait d’utiliser la classe Trace et de définir le symbole “TRACE” dans bibliothèque de classe…
Mais cette façon n’est pas très propre, car nous loggons dans le listener “Trace” au lieu du listener “Debug”.
Si celui-ci est utilisé pour faire autre chose, ces logs ne pourront pas être désactivés et pollueront le channel trace.
Une solution plus optimisée :
Après une petite discussion avec Thomas, il m’a montré comment le framework .NET s’en sort avec ce problème : on définit “localement” la constante DEBUG dans le fichier où on désire “logger” en DEBUG.
1
2
3
4
|
// A définir en début de fichier #define DEBUG Debug.WriteLine( "debug" ); |
Et TADA (Camille all rights reserved ©), ma bibliothèque de classe peut logger en debug et ce sans dégrader ses performances.
En effet, si j’avais défini le symbole au niveau de la bibliothèque de classe en entier, j’aurais activé des comportements uniquement disponibles en DEBUG.
Happy coding.
Commentaires