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 配置中激活没有任何级别的配置。
在这些情况下,您会收到不正确的检查响应。
假设我有这个部分配置,带有 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 配置中激活没有任何级别的配置。
在这些情况下,您会收到不正确的检查响应。