2011-05-18 9 views
4

Nous utilisons Enterprise Library 4.1 pour la journalisation (et la gestion des exceptions/cryptographie).Journalisation de la bibliothèque d'entreprise - comment obtenir le niveau de journalisation configuré lors de l'exécution?

Est-ce que quelqu'un connaît un bon moyen de déterminer le niveau de journalisation configuré à l'exécution? J'ai écrit une classe LogUtility pour faire les appels d'exploitation forestière, et vous appelle comme par cet exemple:

LogUtility.LogVerbose(
    string.Format("Processing event {0}", currentEvent.EventIDImported), 
    MethodBase.GetCurrentMethod().Name, 
    this.GetType().Name 
); 

Je comprends qu'il soit pas réellement connecté au fichier à moins que le niveau de journalisation est définie sur une niveau approprié, dans app.config dans mon cas. Mais je ne veux pas vraiment que les paramètres de la méthode, c'est-à-dire les noms des méthodes et des types, et dans certains cas les chaînes réelles enregistrées, soient évalués à moins que cela ne soit absolument nécessaire.

Cela vous semble-t-il une préoccupation valable? Notre application peut contenir des dizaines de millions d'itérations et de points de connexion. Si possible, je voudrais définir un indicateur basé sur le niveau de journal configuré, et vérifier cela avant de faire l'appel de la méthode ci-dessus.

EDIT - Je suppose que dans l'exemple ci-dessus, je pourrais coder en dur la méthode et taper les noms à chaque appel. Mais j'aimerais quand même savoir s'il existe un moyen de déterminer le niveau.

+1

Ceci est en effet une préoccupation valable. –

Répondre

2

Je ne veux pas vraiment la méthode paramètres, à savoir la méthode et le type noms et dans certains cas, les chaînes réelles en cours d'enregistrement doivent être évaluées sauf en cas de nécessité absolue.

Sur la base de ce qui précède, je pense que vous devriez jeter un oeil à la méthode ShouldLog de LogWriter. Il vous permettra de déterminer si un LogEntry sera enregistré en fonction de la configuration actuelle et vous pouvez (espérons-le) éviter de créer des objets qui ne sont pas nécessaires.

Pour emprunter le code de la bibliothèque Enterprise 4.1 Walkthrough: Checking Filter Status Before Constructing Log Messages:

LogEntry logEntry = new LogEntry(); 
logEntry.Priority = 2; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 

if (Logger.ShouldLog(logEntry)) 
{ 
    // Perform operations (possibly expensive) to gather additional information 
    // for the event to be logged. 
} 
else 
{ 
    // Event will not be logged. Your application can avoid the performance 
    // penalty of collecting information for an event that will not be 
    // logged. 
} 

Puisque vous utilisez votre propre classe LogUtility vous voulez probablement créer une propriété statique sur LogUtility appelé ShouldLogVerbose ou IsVerboseEnabled et à l'intérieur de cette propriété utilisez un "correctement" construit LogEntry (pour votre application) pour déterminer si le message serait enregistré. par exemple.

if (LogUtility.IsVerboseEnabled) 
{ 
    LogUtility.LogVerbose(
     string.Format("Processing event {0}", currentEvent.EventIDImported), 
     MethodBase.GetCurrentMethod().Name, 
     this.GetType().Name 
    ); 
} 
+0

Merci de m'indiquer dans la bonne direction; c'est exactement ce que je cherchais. J'avais l'intention de créer une propriété statique comme vous le décrivez mais je ne savais pas comment obtenir le booléen - "ShouldLog" est ce que je recherchais. – StephenH

Questions connexes