NLog:将序列化的对象记录为消息

问题描述

我已经像这样设置nlog.config以将日志创建为JSON

<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
   <layout type='JsonLayout'>
      <attribute name='time' layout='${longdate}' />
      <attribute name='level' layout='${level:upperCase=true}'/>
      <attribute name='nested' encode='false'  >
         <layout type='JsonLayout'>
            <attribute name='message' layout='${message}' encode='true' />
            <attribute name='exception' layout='${exception}' />
         </layout>
      </attribute>
   </layout>
</target>

记录日志:

public class MessageResult {
   public string Message { get; set; }
   public string IsSuccess { get; set; }
}

public class HomeController : Controller {
   private readonly ILogger _logger;
   *** Dependency injection for ILogger ***

   public IActionResult Index() {
      var message = new MessageResult() {
         Message = "Json test message",IsSuccess = true
      };
      var json = JsonSerializer.Serialize(message);
      _logger.LogWarning(json);

      return View();
   }
}

这是什么记录:

{ "time": "2020-10-08 20:12:35.6472","level": "WARN","nested": { "message": "{\"Message\":\"Json test message\",\"IsSuccess\":true}" } }

但是我想将消息记录为JSON而不是像我一样的字符串 那我该怎么办?

解决方法

我不是先做JSON序列化,而是让日志记录框架来做。通过更改:

  var json = JsonSerializer.Serialize(message);
  _logger.LogWarning(json);

对此:

  _logger.LogWarning("{@message}",message);

并将其用作配置:

<target name='JsonFile' type='File' fileName='${basedir}/logs/nlog-${shortdate}.json'>
   <layout type='JsonLayout'>
      <attribute name='time' layout='${longdate}' />
      <attribute name='level' layout='${level:upperCase=true}'/>
      <attribute name='nested' encode='false'>
         <layout type='JsonLayout' includeAllProperties="true">
            <attribute name='messagetemplate' layout='${message:raw=true}' />
            <attribute name='exception' layout='${exception}' />
         </layout>
      </attribute>
   </layout>
</target>

另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structured-logging

,

您可以使用Serilog。 Serilog是一个现代的记录器框架.Serilog默认提供结构化日志记录。 您可以使用JsonFormatter进行输出,甚至可以编写自定义的格式化程序(json,yaml,xml等)