NLog:记录序列化为 JSON 的对象
NLog: logging an object serialized to JSON
我有一个带有 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" 中的日志条目,而不是它的引用版本。
根据上面@Rolf Kristensen 的评论。本质上,参数 encode="false" 允许记录不带引号的 JSON:
<attribute name="message" layout="${message}" encode="false" />
纯文本现在也未加引号,但这可以通过自定义布局渲染器处理,该渲染器可以区分 JSON 中的纯文本。
另一种可以将 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 设置对象树向下的距离
我有一个带有 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" 中的日志条目,而不是它的引用版本。
根据上面@Rolf Kristensen 的评论。本质上,参数 encode="false" 允许记录不带引号的 JSON:
<attribute name="message" layout="${message}" encode="false" />
纯文本现在也未加引号,但这可以通过自定义布局渲染器处理,该渲染器可以区分 JSON 中的纯文本。
另一种可以将 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 设置对象树向下的距离