2012-03-15 11 views
7

Desidero che un obiettivo NLog interrompa l'ascolto del registro. Il metodo RemoveTarget non sembra funzionare. Ecco un test negativo.Come annullare la sottoscrizione di un obiettivo NLog

public class when_stopping_to_listen 
{ 
    static Logger Logger; 
    static MemoryTarget target; 

    Establish context =() => 
    { 
     var config = new LoggingConfiguration(); 
     Logger = LogManager.GetLogger("TestLogger"); 

     target = new MemoryTarget {Layout = "${message}", Name = "TestTarget"}; 

     config.AddTarget(target.Name, target); 
     config.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, target)); 

     LogManager.Configuration = config; 
    }; 

    Because of =() => 
    { 
     var config = LogManager.Configuration; 
     config.RemoveTarget(target.Name); 
     LogManager.Configuration = config; 
     Logger.Info("Test"); 
    }; 

    It should_be_empty =() => target.Logs.ShouldBeEmpty(); 
} 

Grazie in anticipo.

risposta

9

Non so perché RemoveTarget non funziona. Ma se si rimuove il bersaglio da ogni regola supera il test:

Because of =() => 
{ 
    foreach (var rule in config.LoggingRules) 
    { 
     rule.Targets.Remove(target); 
    }   
    Logger.Info("Test"); 
}; 

E se si rimuove la LoggingRule invece del target funziona anche:

public class when_stopping_to_listen 
{ 
    //... 
    static LoggingRule rule; 

    Establish context =() => 
    { 
     //... 
     rule = new LoggingRule("*", LogLevel.Trace, target); 
     config.LoggingRules.Add(rule);  
     LogManager.Configuration = config; 
    }; 

    Because of =() => 
    { 
     var config = LogManager.Configuration; 
     config.LoggingRules.Remove(rule); 
     LogManager.Configuration = config; 
     Logger.Info("Test"); 
    };  

    //... 
} 
+0

Quindi è tutta una questione di regole? – forki23

+3

Sembra così ... Dal codice sorgente di Nlog sembra che una volta inizializzate le regole con le destinazioni non usi più la raccolta 'LogManager.Configuration.ConfiguredNamedTargets'. Ecco perché il 'RemoveTarget' non funziona. – nemesv

Problemi correlati