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

NLog: How to determine if a named logger was not found in config

假设我有这个部分配置,带有 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!");

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

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

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

bool hasConfigRuleForInfo = missingLogger.IsEnabled(LogLevel.Info)

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

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

我认为这是最好的方法:

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

根据@Julian 的回答,您可能拥有您正在寻找的配置,但没有您正在比较的级别。您甚至可以在 NLog 配置中激活没有任何级别的配置。

在这些情况下,您会收到不正确的检查响应。