Elasticsearch: получение последних N записей из индекса

Моя проблема

Я использую Elasticsearch для хранения потока строк журнала, отправленных из Filebeat. Я хотел бы реализовать tail-подобная функциональность, которая выбирает последние N строк журнала - по их отметке времени - из заданного индекса.

Что я пробовал

Используя комбинацию "from": 0 и сортировка по убыванию @timestamp,

query.json:

{
  "size": 5,
  "from": 0,
  "sort": [
    {
      "@timestamp": {
        "order": "desc",
        "unmapped_type": "boolean"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "source:*.log",
            "analyze_wildcard": true
          }
        }
      ]
    }
  },
  "_source": {
      "include": ["message", "@timestamp"],
      "exclude": "_*"
  }
}

Более широкий контекст и дизайн

Полный дизайн см. В разделе Elasticsearch: разбиение на страницы потока результатов.

Мой вопрос

Как мне получить последние

1 ответ

Кажется, это проблема Filebeat, а не проблема ES.

Мои журналы неструктурированы, это означает, что они не содержат префикс сортируемой даты ISO 8601 или какой-либо другой способ определить, какая строка стоит перед какой.

Теперь предположим, что Filebeat читает файл журнала каждую секунду. За эту секунду было записано 3 строки журнала. Filebeat не знает их времени, поэтому он дает всем трем меткам времени - время их приема, а не время их создания:

У ES нет возможности узнать, кто из них на первом месте, поэтому путаница на стороне читателя.

Будет обновляться, когда у меня будет решение Filebeat.

Другие вопросы по тегам