【问题标题】:NLog: log serialized object as messageNLog:将序列化对象记录为消息
【发布时间】:2020-10-08 16:52:49
【问题描述】:

我已经像这样设置 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,而不是像我得到的那样的字符串 那我该怎么办呢?

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    我不会预先进行 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

    【讨论】:

    • 谢谢,它解决了主要问题,但记录的是:{ "time": "2020-10-10 08:48:42.0724", "level": "WARN", "nested": { "message": "{@message}", "message": {"Message":"Json test message", "IsSuccess":true} } } 有没有办法记录这个:{ "time": "2020-10-10 08:48:42.0724", "level": "WARN", "nested": { "message": {"Message":"Json test message", "IsSuccess":true} } }
    • @reza.mohseni 认为你只需要删除带有layout='${message:raw=true}'的JsonLayout-attribute
    • 不需要名称参数
    • @reza.mohseni 对不起,我不明白。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多