logstash: как включить номер строки входного файла

Я пытаюсь создать способ навигации по моим файлам журнала, и основные функции, которые мне нужны:

  1. искать строки внутри файла журнала (и возвращать строку вхождений).
  2. пагинация от строки x до строки y.

Теперь я проверял Logstash, и он отлично подходил для моей первой функции (поиск), но не очень для второй. У меня была идея, что я могу каким-то образом индексировать номер строки файла вместе с информацией журнала каждой записи, но я не могу найти способ.

Есть ли какой-то фильтр Logstash для этого? или процессор Filebeat? Я не могу заставить это работать.

Я подумал, что, возможно, я мог бы создать способ входа всех моих процессов в базу данных с обработанной информацией, но это также невозможно (или очень сложно), потому что обработчик журнала также не знает, какая текущая строка журнала.

В конце концов, что я мог бы сделать, так это то, что способ разбить мой файл журнала на страницы (через службу) будет состоять в том, чтобы фактически открыть его, перейти к определенной строке и показать его в службе, что не очень оптимально, так как файл может быть очень большим, и я уже индексирую его в Elasticsearch (с помощью Logstash).

Моя текущая конфигурация очень проста:

Файлбит

filebeat.prospectors:
- type: log
  paths:
    - /path/of/logs/*.log
output.logstash:
  hosts: ["localhost:5044"]

Логсташ

input {
    beats {
        port => "5044"
    }
}
output {
  elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

Прямо сейчас, например, я получаю такой элемент, как:

    {
      "beat": {
        "hostname": "my.local",
        "name": "my.local",
        "version": "6.2.2"
      },
      "@timestamp": "2018-02-26T04:25:16.832Z",
      "host": "my.local",
      "tags": [
        "beats_input_codec_plain_applied",
      ],
      "prospector": {
        "type": "log"
      },
      "@version": "1",
      "message": "2018-02-25 22:37:55 [mylibrary] INFO: this is an example log line",
      "source": "/path/of/logs/example.log",
      "offset": 1124
    }

Если бы я мог каким-то образом включить в этот элемент поле типа line_number: 1, было бы здорово, поскольку я мог бы использовать фильтры Elasticsearch для навигации по всем журналам.


Если у вас есть идеи по поводу различных способов хранения моих журналов (и навигации), пожалуйста, дайте мне знать


person eLRuLL    schedule 26.02.2018    source источник
comment
На github есть обсуждение аналогичного запроса: github.com/elastic/beats/issues/1037< /а>   -  person sammy    schedule 01.03.2018
comment
Однако я не уверен, что вы ищете. Вы знаете, что Kibana в определенной степени может показать вам события в файле. Он не даст вам постраничный список, где вы действительно можете щелкнуть номер страницы, но, используя временные рамки, вы теоретически можете просмотреть весь файл.   -  person Andrei Stefan    schedule 02.03.2018
comment
Да, я мог бы запросить диапазон времени, но было бы проще (и надежнее) запросить диапазон номеров строк.   -  person eLRuLL    schedule 02.03.2018
comment
На данный момент я не уверен, что это сработает. Logstash, Beats, Kibana — все имеют представление о событиях во времени, и в основном это то, как все устроено. Номера строк больше похожи на функциональность текстового редактора.   -  person Andrei Stefan    schedule 02.03.2018


Ответы (3)


Созданы ли файлы журнала вами? Или вы можете изменить структуру журнала? Затем вы можете добавить счетчик в качестве префикса и отфильтровать его с помощью logstash.

Например для

12345 2018-02-25 22:37:55 [mylibrary] INFO: this is an example log line

ваш фильтр должен выглядеть так:

filter {
   grok {
     match => {"message" => "%{INT:count} %{GREEDYDATA:message}"
     overwrite => ["message"]
   }
}

Будет создано новое поле «количество». Затем вы можете использовать его для своих целей.

person Sergej Schelle    schedule 07.03.2018
comment
Шаблон должен выглядеть так: "%{INT:count} %{GREEDYDATA:message}" - person Val; 08.03.2018

На данный момент я не думаю, что здесь есть какие-либо решения. Logstash, Beats, Kibana — все имеют представление о событиях во времени, и в основном это то, как все устроено. Номера строк больше похожи на функциональность текстового редактора.

В определенной степени Kibana может показать вам события в файле. Он не даст вам постраничный список, где вы действительно можете щелкнуть номер страницы, но, используя временные рамки, вы теоретически можете просмотреть весь файл.

Есть аналогичные запросы (улучшения) для Beats и Logstash.

person Andrei Stefan    schedule 07.03.2018

Сначала позвольте мне указать, что, вероятно, является основной причиной того, что в Filebeat еще нет поля с номером строки. Когда Filebeat возобновляет чтение файла (например, после перезапуска), он делает fseek, чтобы возобновить чтение с последнего записанного смещения. Если бы ему нужно было сообщить номера строк, ему нужно было бы либо сохранить это состояние в своем реестре, либо перечитать файл и подсчитать новые строки до смещения.

Если вы хотите предложить услугу, позволяющую разбивать на страницы журналы, поддерживаемые Elasticsearch, вы можете использовать scroll API с запросом файла. Вы должны отсортировать результаты по @timestamp, а затем offset. Ваша служба будет использовать запрос прокрутки, чтобы получить первую страницу результатов.

POST /filebeat-*/_search?scroll=1m
{
  "size": 10,
  "query": {
    "match": {
      "source": "/var/log/messages"
    }
  },
  "sort": [
    {
      "@timestamp": {
        "order": "asc"
      }
    },
    {
      "offset": "asc"
    }
  ]
}

Затем, чтобы получить все будущие страницы, вы используете scroll_id, возвращенный из первого запроса.

POST  /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBwAAAAAAPXDOFk12OEYw="
}

Это даст вам все данные журнала для данного имени файла, даже отслеживая его по ротации. Если номера строк имеют решающее значение, вы можете создавать их синтетически, подсчитывая события, начиная с первого события, имеющего offset == 0, но я избегаю этого, потому что это очень подвержено ошибкам, особенно если вы когда-либо добавляете какую-либо фильтрацию или многострочную группировку.

person A J    schedule 08.03.2018