【问题标题】:NLog Define multiple identical final rules with different log levels for multiple targetsNLog 为多个目标定义多个具有不同日志级别的相同最终规则
【发布时间】:2020-11-26 13:31:45
【问题描述】:

我正在尝试使用多个 final 规则将带有 NLog 的消息记录到多个目标。

情况

NLog 版本:4.7.5
平台:.NET CORE 3.1
配置:XML Fileconfigured programmatically

我有 2 个目标 FileConsole

LogManager.Configuration.AddTarget(fileTarget);
LogManager.Configuration.AddTarget(consoleTarget);

还有多个规则,比如

new LoggingRule() {LoggerNamePattern = "A*",                           Target = fileTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot*",                       Target = fileTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of*",                    Target = fileTarget, MinLevel = Info,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical*",       Target = fileTarget, MinLevel = Info,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical.Rules*", Target = fileTarget, MinLevel = Debug, Final = true};

new LoggingRule() {LoggerNamePattern = "A*",                           Target = consoleTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot*",                       Target = consoleTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of*",                    Target = consoleTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical*",       Target = consoleTarget, MinLevel = Warn,  Final = true};
new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical.Rules*", Target = consoleTarget, MinLevel = Trace, Final = true};

我知道TargetMinLevel 不是有效属性,但它更容易显示

Rules 必须是final,否则我的所有日​​志消息都是重复的。

编辑:用户可以在运行时为每个rule 和每个target 更改LogLevel

问题

当我创建一个新的rule 时,我必须为此rule 设置targets。当我将多个targets 添加到一个规则时,我会在每个目标中收到消息但我只能为targets 定义LogLevel当我添加rule 两次时,每个rule 有一个target,然后我只在控制台中而不是在文件中获取消息,因为final 停止了另一个rules

我已经检查了 NLog 页面、NLog GitHub 和 StackOverflow 页面。他们所有的问题都是如何登录到多个目标,或者使用不同的规则登录到多个目标,但每个目标只有一个规则。

预期

为每个目标定义多个final rules 和不同的LogLevel

【问题讨论】:

    标签: nlog asp.net-core-3.1


    【解决方案1】:

    我建议不要按目标分组,而是按 logger-name-pattern 对它们进行分组,并将最具体的 logger-name-pattern 放在顶部:

    new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical.Rules*", Target = fileTarget, MinLevel = Debug, Final = false};
    new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical.Rules*", Target = consoleTarget, MinLevel = Trace, Final = true};
    
    new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical*",       Target = consoleTarget, MinLevel = Warn,  Final = false};
    new LoggingRule() {LoggerNamePattern = "A.Lot.Of.Hierarchical*",       Target = fileTarget, MinLevel = Info,  Final = true};
    
    new LoggingRule() {LoggerNamePattern = "A.Lot.Of*",                    Target = fileTarget, MinLevel = Info,  Final = false};
    new LoggingRule() {LoggerNamePattern = "A.Lot.Of*",                    Target = consoleTarget, MinLevel = Warn,  Final = true};
    
    new LoggingRule() {LoggerNamePattern = "A.Lot*",                       Target = fileTarget, MinLevel = Warn,  Final = false};
    new LoggingRule() {LoggerNamePattern = "A.Lot*",                       Target = consoleTarget, MinLevel = Warn,  Final = true};
    
    new LoggingRule() {LoggerNamePattern = "A*",                           Target = fileTarget, MinLevel = Warn,  Final = false};
    new LoggingRule() {LoggerNamePattern = "A*",                           Target = consoleTarget, MinLevel = Warn,  Final = true};
    
    new LoggingRule() {LoggerNamePattern = "*",                            Target = fileTarget, MinLevel = Warn,  Final = false};
    new LoggingRule() {LoggerNamePattern = "*",                            Target = consoleTarget, MinLevel = Warn,  Final = false};
    

    您还可以创建没有任何目标的“黑洞”日志记录规则。通过设置 minLevel = Trace 和 Final = true。那么任何匹配 LoggerNamePattern 的输出都不会流向任何可能遵循的规则。

    但也许我误解了这个问题。另见:https://github.com/nlog/NLog/wiki/Configuration-file#logger-name-filter

    【讨论】:

    • 我认为,这行不通,因为用户可以在运行时为每个规则和每个目标更改LogLevel。但我会试试看。
    • @TheBigNeo 如果用户直接更改 NLog-config,那么我猜用户知道如何使用 NLog。如果用户不知道它有效,那么您可能需要构建一个配置编辑器工具来保护用户免受伤害。
    • 需要额外目标的用户可以在配置文件中手动完成。他们必须处理 NLog。只更改LogLevel 的用户可以通过 GUI 执行此操作,因为我们有配置文件和编程配置
    • 所以不可能?
    • @TheBigNeo 我刚刚向您展示了如何使用最终规则。相信这就是问题所在。听起来您正在为您的用户构建一个令人兴奋的解决方案,而 NLog 对过滤和配置有强大的支持。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多