NLog:记录序列化为JSON的对象

时间:2017-06-07 08:21:14

标签: .net json nlog

我有带有NLog配置的.Net项目,它允许我生成JSON格式的日志文件。它可以与简单的文本消息一起使用。现在,我需要记录已经序列化为JSON的许多任意对象。当我将这些JSON字符串记录为日志消息时,NLog将文本放在引号中,然后转义内部JSON语法。这使得这样的输出无法使用。到目前为止,我没有找到NLog功能或布局设置,只是将我的JSON字符串转储为文字,没有引号和转义字符。我错过了什么吗?

实施例。目前我的日志条目如下:]

{ "dateTime": "2017-06-07 11:50:55.7324", "level": "DEBUG", "message": "\"description\": \"blah-blah\", \"Request\": { \"Request URL\":\/somepagepage\/}, \"Content\": { \"Form\": { ... } , \"Body\": \"Blah\" } ", "utcDateTime": "2017-06-05 06:10:34.1411" }

相反,我需要让它们看起来像:

{ "dateTime": "2017-06-07 11:50:55.7324", "level": "DEBUG", "message":
 { "description": "blah-blah", "Request": { "Request URL":/somepagepage/, "Content": { "Form": {...}, "Body": "Blah" }  }, "utcDateTime": "2017-06-05 06:10:34.1411" }

NLog.config的相关部分:

 <layout xsi:type="JsonLayout">
   <attribute name="dateTime" layout="${longdate}" />
   <attribute name="level" layout="${level:upperCase=true}"/>
   <attribute name="message" layout="${message}" /> 
   <attribute name="utcDateTime" layout="${longdate:universalTime=true}" />
 </layout>

最终,我希望看到一个日志条目,其中JSON嵌套在“message”中,而不是它的引用版本。

2 个答案:

答案 0 :(得分:4)

根据@Rolf Kristensen的评论。基本上,参数encode =&#34; false&#34;允许记录未加引号的JSON:

  <attribute name="message" layout="${message}" encode="false" /> 

纯文本现在也没有引用,但这可以通过自定义布局渲染器来处理,该渲染器可以告诉JSON的纯文本。

答案 1 :(得分:0)

将json添加到日志记录的另一种方法是使用JsonLayout布局类型,并将includeAllProperties设置为true。

您的记录器布局配置应如下所示:

<layout xsi:type="JsonLayout" includeAllProperties="true" maxRecursionLimit="4">
</layout>

您的日志记录代码如下:

ILogger Logger = LogManager.GetCurrentClassLogger();
MyClass request = new MyClass(){ThisProp = "foo", ThatProp = "bar"};

LogEventInfo e = new LogEventInfo(LogLevel.Info, "EmptyResponseLogger", "");
e.Properties["Request"] = request;

Logger.Log(e);

您应该以类似以下内容结束:

{ "time": "2019-02-05 19:12:10.1643", "logger": "MyClassLogger", "level": "INFO", "Request": {"ThisProp":"foo", "ThatProp": "bar"} }

这样做将在日志行的“ Request”属性中写出一个JSON对象,并为您提供所需的响应。 maxRecursionLimit设置对象树向下的距离

Json Layout Documentation