如何取消订阅NLog目标

本文关键字:NLog 目标 取消 何取消 | 更新日期: 2023-09-27 18:28:00

我希望NLog目标停止侦听日志。RemoveTarget方法似乎不起作用。这是一个失败的测试。

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();
}

提前谢谢。

如何取消订阅NLog目标

我不知道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");
    };      
    //...
}

NLog第4.5版修复了LoggingConfiguration.RemoveTarget,因此它从所有注册的LoggingRules中删除了目标。

另请参阅:https://github.com/NLog/NLog/pull/2549