2012-03-15 110 views
7

我希望NLog目標停止監聽日誌。 RemoveTarget方法似乎不起作用。這是一個失敗的測試。如何取消訂閱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(); 
} 

在此先感謝。

回答

9

我不知道爲什麼RemoveTarget不起作用。但是,如果你從每個移除目標規則測試通過:

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

如果您刪除LoggingRule代替它也適用對象:

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

所以它的所有有關的規則? – forki23 2012-03-15 19:35:02

+3

似乎是這樣的......從Nlog的源代碼中,它似乎一旦初始化規則並且不再使用LogManager.Configuration.ConfiguredNamedTargets集合。這就是爲什麼'RemoveTarget'不起作用。 – nemesv 2012-03-15 19:38:19