2010-01-04 4 views
2

La consignation externe peut être coûteuse. Par conséquent, je pourrais désactiver la journalisation ou augmenter le niveau de seuil de journalisation pour réduire la journalisation en mode production (tout le monde le sait!)Préemption de consignation

Cependant, qu'en est-il des routines appelées à fournir des paramètres à l'instruction logger?

Considérez l'instruction du consignateur.

logger.info ("nombre de fenêtres =" + wins.size()); Wins12 (

)

où wins.size() est une opération extrêmement coûteuse - disons, juste pour illustrer ma (mauvaise) compréhension du problème.

Si la consignation d'informations est désactivée, wins.size() est toujours exécuté. Parce que quand je fais le débogage, il semble que wins.size() est renversé avant log.info(). Si oui, quelles sont vos stratégies pour empêcher l'exécution de fonctions coûteuses dans une instruction de logger si le logger est désactivé?

Répondre

5

En C# 3.0, vous pouvez utiliser lambdas pour exécuter uniquement un appel à la fonction de journalisation lorsque la journalisation est activée. Ceci est par exemple en utilisant C# Common.Logging:

Logger.Trace(m=>m("number of windows="+wins.size())); 

où Trace est défini comme ceci:

void Trace(Action<FormatMessageHandler> formatMessageCallback); 

et FormatMessageHandler est

public delegate string FormatMessageHandler(string format, params object[] args); 

Alors qu'est-ce qui se passe est si le suivi est activé sur le m=>m("number of windows="+wins.size()) lambda est appelé. Si c'est désactivé, l'appel coûteux pour obtenir la taille de la fenêtre n'est jamais fait.

2

Vous devez toujours vérifier si un niveau de journalisation est activé AVANT la journalisation, en particulier. Si vous envisagez d'enregistrer quelque chose qui nécessite un calcul particulièrement coûteux. commons-logging d'Apache pour Java vous permet de mettre en avant les gardes de votre code pour que vous puissiez le faire:

if (logger.isInfoEnabled()) { 
     logger.info("number of windows="+wins.size()); 
} 

Si l'enregistrement d'information est désactivée, wins.size() est garanti de ne pas courir. Vous pouvez faire des choses similaires avec Log4j et les classes Java intégrées.

1

J'ai utilisé une stratégie similaire à celle d'un projet récemment pour éviter d'avoir à faire des vérifications comme logger.IsDebugEnabled() partout. Essentiellement, j'ai dérivé d'une implémentation de base de logger et ai ajouté une méthode supplémentaire qui a accepté un Closure qui a appelé la méthode chère. Passer dans la fermeture n'exécute pas le code jusqu'à ce que vous l'invoquiez réellement. La journalisation devrait être aussi orientée aspect que possible, et elle devrait certainement fonctionner sans avoir à apporter des modifications à l'ensemble de votre code. En C# et en Ruby, l'approche serait similaire: passer dans un lambda ou un bloc, et différer l'exécution du code jusqu'à ce qu'il soit réellement nécessaire à l'exécution. Gagnant-gagnant!

0

This article parle de méthodes de journalisation génériques en rapport avec Java. Excellente lecture.

Questions connexes