2010-11-30 38 views
1

J'ai le code suivant dans mon application C# en utilisant Nlog. Les messages avec 'Debug' sont enregistrés, mais pas 'Info'. J'avais supposé que puisque minLevel est réglé sur 'Debug' dans app.config, les messages 'Info' seront également enregistrés, puisque Debug a une priorité plus haute sur 'Info'. Mais ils ne sont pas connectés. Où ai-je tort?Pourquoi les messages de niveau Info ne sont-ils pas journalisés lorsque le niveau minimum est Debug?

Merci.

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

C'est le app.config réglage

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets> 
    <target name="file" xsi:type="File" fileName="E:/Logoutputs/Remissol-Nlog.txt" /> 
</targets> 

<rules> 
    <logger name="*" minlevel="Debug" writeTo="file" /> 
</rules> 

Répondre

3

Ce n'est pas vraiment une réponse différente de celle de @Nobby, car il a raison sur les niveaux. Je dirai que vous n'avez pas à faire la vérification IfXXXXEnabled avant de vous connecter.

C'est ce que vous avez actuellement dans votre code C# dans votre question pour votre site d'appel d'enregistrement:

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

@Nobby suggère, cela pourrait être fait plus propre en faisant ceci:

if (logger.IsDebugEnabled) logger.Debug(logMessage); 
if (logger.IsInfoEnabled) logger.Info(logMessage); 

Je ne pense pas que ce soit vraiment vrai. Avec votre code d'origine, SEULEMENT le message de débogage OU le message d'information sera enregistré. Si vous supprimez l'imbrication, le niveau d'enregistrement activé vous permet d'enregistrer les DEUX messages.

Je pense que vous devriez connectez cette façon:

logger.Debug(logMessage); 
logger.Info(logMessage); 

Les méthodes d'exploitation forestière (logger.debug, Logger.INFO, etc) font déjà un contrôle IsXXXEnabled et n'enregistrerez pas si ce niveau de journalisation n'est pas activée. Vous pouvez enregistrer un journal de frappe (et de confusion) en effectuant directement l'appel de journalisation plutôt que de le protéger avec la vérification if.

Il existe des cas où vous souhaitez utiliser la vérification IsXXXEnabled. Tels que si vous avez du travail à faire pour le calcul être connecté à la valeur (s) et que vous voulez faire ce calcul si vous vous connectez:

if (logger.IsDebugEnabled) 
{ 
    int value1 = DoSomeExpensiveCalculation(); 
    int value2 = DoSomeOtherExpensiveCalculation(); 
    logger.DebugFormat("v1 = {0}, v2 = {1}", value1, value2); 
} 

De cette façon, vous ne payez pas le prix des calculs à moins que vous allez les connecter.

Enfin, NLog 2.0 vous avez accès à la syntaxe lambda qui vous permettra de différer potentiellement coûteuses opérations à moins que le message soit enregistré:

logger.Debug(() => string.Format("v1 = {0}, v2 = {1}", DoSomeExpensiveCalculation(), DoSomeOtherExpensiveCalculation())); 

logger.Debug(() => "message" + i + ", " + j + "," + k); 

Dans les deux cas, l'expression qui est passé à NLog ne sera pas évalué à moins que le niveau DEBUG soit activé.

2

Votre problème réside dans le imbriquée si les déclarations dans votre exemple. Les deux niveaux de débogage et de journal d'informations sont activés en fonction de votre fichier de configuration. La première instruction if est ensuite évaluée et son bloc exécuté car la condition est vraie. Le bloc else n'est donc jamais atteint et votre message Info n'est jamais enregistré.

Je vous suggère de diviser vos instructions if imbriquées en 2 instructions distinctes si vous souhaitez consigner le message pour les niveaux de débogage et d'informations.