在使用File和Programmatic NLog配置时,将记录器隔离为仅输出到特定目标

时间:2016-07-05 16:12:37

标签: c# asp.net-mvc logging nlog

我试图从"普通"内部进行一些非常具体的记录。将被多个Web应用程序使用的类库。 "消费" Web应用程序可能会也可能不会对自己进行一些NLog日志记录。我想以某种方式隔离日志记录配置,以便:

  • 来自类库的任何日志记录都不会在使用Web应用程序
  • 配置的目标中结束
  • 来自使用Web应用程序的任何日志记录都不会以类库
  • 配置的目标结束

到目前为止,我已经设法从类库中以编程方式设置日志记录配置,以便它可以共存"使用来自消费Web应用程序的日志记录配置。我做了这样的事情:

public static void RegisterLoggingConfiguration()
{
    // If there is existing configuration then just use that and update it.  Otherwise, create brand new config.
    var config = LogManager.Configuration ?? new LoggingConfiguration();

    var specialTarget = new FileTarget { FileName = @"C:\Logs\SpecialLog.txt" };
    config.AddTarget("specialTarget", specialTarget);

    var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true };
    config.LoggingRules.Add(specialRule);

    LogManager.Configuration = config;  
}

关键是我按名称定位特定记录器,以便将其输出定向到特定文件目标。例如,在我的类库中的某个地方:

var logger = LogManager.GetLogger("SpecialLoggerName");

上面的程序化配置中,此行与名称匹配:

var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true };

到目前为止一切顺利。但问题是,当一个消费的Web应用程序有自己的日志记录设置并使用一个全能记录器时,它也会捕获我的特殊记录器输出。像这样:

<logger name="*" minlevel="Info" writeTo="someLogfile" />

我认为这是因为程序化日志配置最终会添加&#34;特殊目标&#34;在现有的记录器列表的末尾,所以整个&#34; final = true&#34;实际上并没有帮助。初看起来,我没有找到在特定索引处添加目标的方法。但如果有人有办法,请告诉我。

或者,如果有人对如何从公共类库中隔离日志记录有其他想法,请告诉我。

1 个答案:

答案 0 :(得分:1)

啊,我觉得这么笨!事实证明,有一种简单的方法可以在特定的索引处插入规则,我错过了:

//config.LoggingRules.Add(specialRule);       // old way
config.LoggingRules.Insert(0, specialRule);   // new way

我过分关注LoggingRules.Add(...)无法指定索引,我完全错过了Insert(int index, LoggingRule item)方法。

我希望有一天能帮助其他人寻找类似的东西。