Как заставить Logstash повторно просмотреть файл?

Я установил Logstash для анализа файлов Apache. Мне потребовалось совсем немного, чтобы правильно настроить настройки, и я всегда старался использовать реальные журналы. Я заметил (как говорится в документации), что logstash "запоминает", где он был в файле. Теперь мои настройки ОК, и я бы хотел, чтобы Logstash "забыл". Это кажется сложнее, чем я. Я уже сделал следующее:

  • : start_position => "beginning"

  • удалил всю папку "данных" из elastissearch (и остановил ее сначала)

  • посмотрел, какие файлы, открытые logstash с помощью lsof -p PID, и удалил все, что было многообещающим (в моем случае /tmp/jffi*.tmp)

Все еще Logstash не забывает и анализирует только "свежие" файлы в папке, где находятся журналы

Любые идеи?

Ответ 1

По умолчанию logstash пишет, что последняя позиция была включена в файл журнала, который обычно находится в $HOME/.sincedb. Logstash можно обмануть, полагая, что он никогда не разбирал файл журнала, указав /dev/null как sincedb_path.

Здесь приведена часть документа Входной файл.

Где писать базу данных from (отслеживает текущую позицию контролируемых файлов журнала). Значение по умолчанию для переменной среды "$ SINCEDB_PATH" или "$ HOME/.sincedb".

Пример конфигурации

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

Ответ 2

Плагин хранилище файлов истории "размытию" в sincedb файле, по умолчанию: при $ HOME/.sincedb * см http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Поскольку файл db содержит строку, похожую на:

[inode] [major device number] [minor device number] [byte offset]

Итак, если вы хотите снова проанализировать полный файл, вам необходимо:

  • удалить файлы sindedb
  • ИЛИ только удалите соответствующую строку в файле sincedb, проверьте номер инода перед вашим файлом (ls -i yourFile | awk '{print $1}')
  • И перезапустите Logstash

С ключом start_position => "beginning" begin start_position => "beginning", Logstash проанализирует весь файл.

Пример файла sincedb:

Ответ 3

Logstash будет вести запись в $HOME/.sincedb_*. Вы можете удалить все .sincedb и перезапустить logstash, Logstash повторно проанализирует файл.

Ответ 4

Объединяя все ответы, угадайте, что это лучший способ проанализировать файлы. Я сделал то же самое для тестирования.

input {
  file {
    path => "/tmp/access_log"
    start_position => beginning
    sincedb_path => "/dev/null"
    ignore_older => 0
  }
}

Для быстрого теста вместо ignore_older вы также можете touch /tmp/access_log изменить временную метку файла.

Ответ 5

Если вы используете logstash-forwarder, проверьте свой домашний файл .logstash-forwarder:

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}

Ответ 6

После удаления $HOME/.sincedb_* он все еще не принимал данные для меня.

Попробовав кучу вещей, я удалил все, кроме основного файла .conf из /etc/logstash/conf.d и перезапустил Logstash, и все заработало. Я могу только предположить, что было что-то в одном из файлов .conf, на котором молча висел logstash.

Ответ 7

На самом деле перепараллеливать каждый раз очень дорого, если в файле есть большие данные. Поэтому вам нужно быть осторожным, прежде чем делать это. Если мы хотим снова заново его повторить, установите параметр внутри входного блока

sincedb_path => "/dev/null" 

Этот параметр не будет хранить файл .sincedb, и logstash будет повторяться каждый раз. Но если вы хотите периодически переделывать не каждый раз, то то, что вы можете сделать, это удалить вручную путь .sinceDb, который создается при разборе файла. Как правило, он присутствует в домашнем каталоге как скрытый файл, если вы не являетесь пользователем root в противном случае в корневом каталоге. Вы также можете установить путь sincedb_path в другое место, чтобы легко отслеживать этот файл.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"

Ответ 8

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

Ответ 9

Я нашел его в своем домашнем каталоге, но после его удаления, logstash отказался перебирать существующие файлы журналов. То, как я получил его на работу, было добавить

sincedb_path => "/opt/elk/sincedb/"  

в мой файловый плагин. Я думаю, что reset каждый раз, просто измените путь sincedb_path

Ответ 10

если вы используете tar.gz, установите filebeat, вы можете удалить этот файл, $FilebeatPath/data/registry/filebeat/data.json и повторно запустить filebeat

Ответ 11

logstash версии 5 новый каталог находится в

<path.data>/plugins/inputs/file

определение path.data находится в logstash.yml