代码之家  ›  专栏  ›  技术社区  ›  enorl76

使用Nlog messageGeneratorFunc和结构化日志

  •  1
  • enorl76  · 技术社区  · 7 年前

    Log.Info("The record {id} has firstname {firstname} and lastname {lastname}",
        record.Id, record.FirstName, record.LastName)
    

    Log.IsDebugEnabled

    Log.Debug(() => string.Format("The record {0} has firstname {1} and lastname {2}",
        record.Id, record.FirstName, record.LastName);
    

    我想知道如何在messageGeneratorFunc中使用结构化日志记录?

    Log.Debug(() => Log.Debug("The record {id} has firstname {firstname} and lastname {lastname}",
        record.Id, record.FirstName, record.LastName
    

    看起来很奇怪。。。 Log.Debug Log.Debug 但当然有用。。。IsDebugEnabled的内部检查发生两次。。。有没有一个合适的替代方案,或者说应该是这样的?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rolf Kristensen Raúl Diego    7 年前

    messageGeneratorFunc委托用于重/大对象的专门序列化。未启用LogLevel时,NLog不会调用委托。

    使用messageGeneratorFunc委托来处理简单的消息模板是没有意义的。它实际上只会损害性能,因为它总是需要执行委托捕获,即使没有启用LogLevel。

    Log.Debug("The record {0} has firstname {1} and lastname {2}",
        record.Id, record.FirstName, record.LastName);
    
    Log.Debug("The record {id} has firstname {firstname} and lastname {lastname}",
        record.Id, record.FirstName, record.LastName);
    

    Log.Debug(() => string.Format("The record {0} has firstname {1} and lastname {2}",
        record.Id, record.FirstName, record.LastName);
    

    Logger should handle string formatting