2017-04-08 1 views
1

Disons que j'ai cette configuration partielle, avec NLog:NLog: Comment déterminer si un enregistreur nommé n'a pas été trouvé dans la configuration

<rules> 
    <logger name="ExistsInConfig" writeTo="Console"/> 
</rules> 

..et j'écris ce code:

var configuredLogger = LogManager.GetLogger("ExistsInConfig"); 
configuredLogger.Log(LogLevel.Info, "hello, cruel world!"); 

var missingLogger = LogManager.GetLogger("NotInConfig"); 
missingLogger.Log(LogLevel.Info, "goodbye, cruel world!"); 

Dans la sortie de la console, je ne vois que la première instruction de journalisation, car le second enregistreur nommé n'a pas été trouvé dans le fichier de configuration.

Comment puis-je détecter par programme que le second enregistreur n'a pas été trouvé et ne produira donc aucune sortie?

Répondre

0

Si vous avez l'instance de Logger, vous pouvez demander à ce:

bool hasConfigRuleForInfo = missingLogger.IsEnabled(LogLevel.Info) 

Sinon, vous avez besoin de quelques astuces, quelques possibilités:

  • ou créer votre propre classe LogManager se souvenir de qui se souvient quels enregistreurs sont utilisés
  • ou lire avec réflexion la propriété privée LogManager.factory.loggerCache (non pris en charge bien sûr;))
  • ajoutez une règle générique (*) à votre configuration (API ou XML) et écrivez à MemoryTarget ou à une cible personnalisée. Cela pourrait affecter votre performance. PS. Avec ${logger}, vous obtenez le nom du consignateur. Vous aurez également besoin de l'option final sur d'autres règles.
+0

Merci pour le conseil! Je vais avoir l'instance de l'enregistreur, mais en vérifiant .IsEnabled (LogLevel) pourrait échouer si un enregistreur nommé est trouvé, mais n'a tout simplement pas la journalisation activée pour ce niveau .. J'avais envisagé d'aller sur cette route et en regardant voir si l'enregistreur est activé pour * tous * les niveaux, mais même alors, il serait possible pour quelqu'un de délibérément (et légitimement) configurer un enregistreur de cette façon .. – badlife

+0

est-ce pour vous? Accepté/autorisé à voter;) – Julian

+0

Je suis trop nouveau pour pouvoir accepter une réponse ou un vote. Quand je clique sur le vote en amont, on me dit que c'est enregistré mais ne sera pas affiché. – badlife