使用NLog,当我记录对象/"结构化数据"到Elastic Search它存储在我无法查询的地方,请查看下图:
<target xsi:type="ElasticSearch"
name="MyElasticTarget"
uri="url"
requireAuth="true"
username="MyUser"
password="MyPass"
Index="MyIndex-${date:format=yyyy.MM.dd}"
>
<layout xsi:type="JsonLayout" type='JsonLayout' IncludeAllProperties='true'>
<attribute name='LogMessage' layout='${MySimpleClass:raw=true}' />
</layout>
</target>
</targets>
代码是:
var _simpleObj = new MySimpleClass(5, "my structured Simple obj", "Sometype");
var logger = LogManager.GetLogger("Example");
logger.Info("{@MySimpleClass}", _simpleObj );
当我使用SeriLog记录/存储相同的结构化数据时,我可以进行查询,因为我有消息范围之外的对象字段和字段,请查看下图:
任何想法如何记录结构化数据(对象)能够通过使用NLog查询它们?
答案 0 :(得分:3)
您是否尝试为NLog target启用 includeAllProperties 属性:
<target xsi:type="ElasticSearch" includeAllProperties="true" />
您还可以添加自己的自定义字段:
<target xsi:type="ElasticSearch" includeAllProperties="true">
<field name="messageTemplate" layout="${message:raw=true}" />
</target>
答案 1 :(得分:1)
我认为你应该使用 Logstash 过滤器来解码你的json字符串。我不知道NLog是否支持Logstash过滤器,但有更好,更强大的工具可以满足您的需求。 Log4Net是非常强大且广泛使用的库,并且有一个很好的Elasticsearch appneder库,它的 Log4Stash 支持Logstash过滤器。它高效且易于使用。见下面的链接
http://devthings.com.ua/logging-in-asp-net-web-api-using-log4net-and-elasticsearch/