使用 NLog 4.5 将结构化数据记录到 Elastic Search 不提供在字段中查询的能力

Log Structured data to Elastic Search by using NLog 4.5 doesn't provide the ability to query in the fields

使用 NLog,当我将对象/"structured data" 记录到 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 );

当我 log/store 使用 SeriLog 的相同结构化数据时,我可以进行查询,因为我的对象字段超出了消息范围并且作为字段,请看下图:

知道如何记录结构化数据(对象)以便能够使用 NLog 查询它们吗?

我认为你应该使用 Logstash 过滤器来解码你的 json 字符串。我不知道 NLog 是否支持 Logstash 过滤器,但有更好更强大的工具可以满足您的需求。 Log4Net 是一个非常强大且广泛使用的库,并且有一个很好的 Elasticsearch appneder 库,它是支持 Logstash 过滤器的 Log4Stash。它高效且易于使用。请参阅下面的 link

http://devthings.com.ua/logging-in-asp-net-web-api-using-log4net-and-elasticsearch/

您是否尝试为 NLog target:

启用 includeAllProperties 属性
<target xsi:type="ElasticSearch" includeAllProperties="true" />

您还可以添加自己的自定义字段:

<target xsi:type="ElasticSearch" includeAllProperties="true">
     <field name="messageTemplate" layout="${message:raw=true}" />
</target>