2012-03-15 109 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