使用NLog 4.5将结构化数据记录到弹性搜索并不能提供在字段中查询的功能

时间:2018-04-08 17:10:33

标签: asp.net elasticsearch nlog

使用NLog,当我记录对象/"结构化数据"到Elastic Search它存储在我无法查询的地方,请查看下图: enter image description here

      <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记录/存储相同的结构化数据时,我可以进行查询,因为我有消息范围之外的对象字段和字段,请查看下图:

enter image description here

任何想法如何记录结构化数据(对象)能够通过使用NLog查询它们?

2 个答案:

答案 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/