NLog:如何确定在config中是否找不到命名的记录器

时间:2017-04-08 17:33:42

标签: c# .net logging configuration nlog

假设我有部分配置,使用NLog:

<rules>
   <logger name="ExistsInConfig" writeTo="Console"/>
</rules>

..然后我写下这段代码:

var configuredLogger = LogManager.GetLogger("ExistsInConfig");
configuredLogger.Log(LogLevel.Info, "hello, cruel world!");

var missingLogger = LogManager.GetLogger("NotInConfig");
missingLogger.Log(LogLevel.Info, "goodbye, cruel world!");

在控制台输出中,我将只看到第一个日志记录语句,因为在配置文件中找不到第二个命名记录器。

如何以编程方式检测到未找到第二台记录器,因此不会产生任何输出?

2 个答案:

答案 0 :(得分:0)

如果你有Logger的实例,你可以问它:

bool hasConfigRuleForInfo = missingLogger.IsEnabled(LogLevel.Info)

如果没有,那么你需要一些技巧,一些可能性:

  • 或创建您自己的LogManager类,记住哪个记得使用哪个记录器
  • 或反思阅读私有财产LogManager.factory.loggerCache(当然不支持;))
  • 将通配符(*)规则添加到您的配置(API或XML)并写入MemoryTarget或自定义目标。这可能会影响您的表现。 PS。使用${logger},您将获得记录器名称。您还需要其他规则的final选项。

答案 1 :(得分:0)

我认为这是最好的方法:

if (!NLog.LogManager.Configuration.ConfiguredNamedTargets.Any(t => t.Name.Equals("NameToValidate")))
{ 
//config not found 
}

有了@Julian的回答,你可以拥有你正在寻找的Config,但不是你要比较的水平。你甚至可以在你的NLog配置中没有激活任何级别的Config。

在这些情况下,您会收到错误的检查回复。