Journalisation de trace à faible coût dans Go : désactivation des instructions de journal sans surcharge de performances
La possibilité d'ajouter des instructions de journal de débogage aux chemins critiques sans impact les performances de production sont cruciales. Dans Go, cependant, le coût de l'évaluation des arguments pour les instructions désactivées peut être important.
L'enregistreur sur mesure
Pour résoudre ce problème, un EnabledLogger peut être créé, implémentant le log.Logger et déléguer la sortie à un log.Logger uniquement lorsqu'il est activé. Cela masque efficacement les opérations de formatage et de journalisation lorsqu'elles sont désactivées.
Les limites d'EnabledLogger
Bien que EnabledLogger minimise le coût d'évaluation pour les types de données simples, il ne gère pas les données arbitraires. appels de fonction ou expressions complexes dans les instructions de journal. Pour atténuer cela, deux options sont disponibles :
Types de wrapper :
Les types de wrapper comme Stringify peuvent différer les appels de fonction à évaluer uniquement lorsqu'ils sont activés. Bien que verbeuse, cette approche garantit que le formatage est retardé jusqu'à l'exécution.
Vérifications manuelles :
Des vérifications explicites peuvent également être utilisées pour effectuer le formatage de manière conditionnelle, mais ceci est sujet aux erreurs et nécessite une attention particulière pour garantir la cohérence.
Solutions alternatives
En plus de ces options, d'autres approches incluent :
Interfaces du formateur :
fmt.Stringer et fmt.GoStringer peuvent être exploités pour différer le formatage des types qui implémentent ces interfaces.
Enregistreurs personnalisés :
Le remplacement de l'enregistreur par défaut par un enregistreur personnalisé au moment de l'exécution permet un contrôle plus précis de l'évaluation des données.
Enregistreur en tant que booléen :
Une technique simple mais efficace consiste à utiliser une valeur bool comme enregistreur lui-même, simplifiant le code en éliminant le besoin d'instructions if.
Génération de code :
Les macros de prétraitement peuvent être émulées dans Go en utilisant la génération de code, générant des versions de débogage qui incluent uniquement les instructions de traçage nécessaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!