Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有重复井眼名称的NLog结构化测井_C#_Nlog_Structured Logging - Fatal编程技术网

C# 具有重复井眼名称的NLog结构化测井

C# 具有重复井眼名称的NLog结构化测井,c#,nlog,structured-logging,C#,Nlog,Structured Logging,我正试图找出在NLog中实现的使用重复孔名称捕获属性的正确行为 让我们看一个例子 使用重复的孔名称记录到控制台,但参数计数小于名称计数 // Targets where to log to: File and Console var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, l

我正试图找出在NLog中实现的使用重复孔名称捕获属性的正确行为

让我们看一个例子

  • 使用重复的孔名称记录到控制台,但参数计数小于名称计数

    // Targets where to log to: File and Console
    var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
    config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
    // Apply config           
    NLog.LogManager.Configuration = config;
    NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2); 
    
  • 输出是

    2020-05-26 09:47:37.5013 | INFO | A |你好{A}{b}{A}

    没有任何替代品

  • 使用具有相同参数计数的重复孔名称记录到控制台

    // Targets where to log to: File and Console
    var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
    config.AddRule(global::NLog.LogLevel.Debug, global::NLog.LogLevel.Fatal, logconsole);
    // Apply config           
    NLog.LogManager.Configuration = config;
    NLog.LogManager.GetLogger("A").Info("hello from {a} {b} {a}", 1, 2, 3); 
    
  • 输出是

    2020-05-26 09:49:53.1436 |信息| A |你好,来自123

    替代适用

    因此,我希望在第一种情况下看到替换,但没有。这在NLog中是正确的行为吗


    我已经检查了Serilog第一个案例中的行为。它进行替换。

    根据NLog文档-状态,这是正确的行为

    参数的名称应该是唯一的

    虽然在捕获规则时,不要对参数设置这样的限制:

    如果任何属性名称是非数字的,则所有参数都是非数字的 通过按以下顺序从左到右匹配孔来捕获: 它们出现了

    NLog对从左到右匹配有自己的解释-如果属性计数与参数数量不匹配,则格式不被视为有效的结构化消息模板(检查方法)。这给了你两个预期的结果

    Logger.Info("{User} {Value}", "Bob", 42); // "Bob" 42
    Logger.Info("{User} {Value} {User}", "Bob", 42); // invalid template
    
    一个是不期望的(但NLog已警告您使用唯一属性):


    如果您希望在最后一个示例中获得
    “Joe”42“Joe”
    ,那么您可以在消息模板
    “{0}{1}{0}”
    (不推荐)。

    为什么认为这是正确的
    信息(“来自{a}{b}{a}的你好”,1,2)是否有效?一些NLog指南可能会对@PavelAnikhouski有所帮助,我不知道,在我看来这是合乎逻辑的。a=1,b=2。替代应该占据一席之地。现在我已经检查了serilog提供程序的行为,它在这种情况下进行替换。现在,NLog的这种行为对我们来说似乎更加奇怪me@AlexceiShmakov好奇您为什么对使用无效的消息模板感兴趣?在什么情况下这有用?相信Microsoft ILogger(MEL)在给定无效的占位符数时抛出异常。@RolfKristensen,很难说它在哪种情况下有用。我只是在我的应用程序中实现一个结构化日志层,并考虑了不同的情况。偶然发现了这个案子。我很感兴趣,因为这种行为看起来不合逻辑。所以,我决定问。如果我不明白的话,我只是想找出答案。在这种情况下,如果NLog抛出异常也比沉默要好。谢谢你,Sergey。现在我知道了NLog的这种架构限制。@Alexeishmakov认为NLog做出的唯一架构决定是,当给出无效的输入时,不要在脸上爆炸。并专注于为有效的消息模板提供最佳性能,避免为处理无效消息模板引入开销(避免为扫描正确的占位符值带来任何开销)@RolfKristensen,我理解为什么会这样做。我对此没有任何抱怨。我完全同意你的观点,表现更重要。但现在我知道了这个案例。@RolfKristensen但我必须注意,我进行了基准测试并将NLog与Serilog进行了比较,Serilog处理了这个案例,正如我所提到的。同时,编写结构化日志的两个日志提供程序的性能都很好comparable@AlexceiShmakov总是对基准感兴趣。它是您可以在github上共享的基准吗?
    
    Logger.Info("{User} {Value} {User}", "Bob", 42, "Joe"); // "Bob" 42 "Joe"