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

91

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

  • используемый: start_position => "beginning"

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

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

Тем не менее Logstash не забывает и разбирает только "свежие" файлы в папке, где лежат логи.

Любые идеи?

Кристоф Клод
источник
Последняя версия logstash, которую я нашел в:/opt/logstash/data/plugins/inputs/file
Тим Смит

Ответы:

135

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

Здесь находится часть документации Input File .

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

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

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
Flazzarini
источник
29
В окнах вы можете использовать, sincedb_path => "NUL"чтобы получить тот же эффект. Подробности здесь
Крис Магнусон
11
Если файлы довольно старые (более 24 часов), очень полезно добавить опцию, ingnore_older => 0чтобы logstash принимал их независимо от даты. По умолчанию, если файлы старше, то 24 часа игнорируются.
mtfk 01
1
@mtfk: Ничего себе классная находка! Спасибо, что указали на ignore_older => 0работы в logstash! Меня забила та же проблема, что и спрашивающий. Вроде находка неочевидная! (поиск в Google "ignore_older" и "logstash" вызывает страницы только при filebeat, я не смог найти никаких следов того, как с этим справиться в logstash)
Майк Лутц
Как добавить это при использовании filebeat
Сунилкумар Рамамурти
@SunilkumarRamamurthy Я считаю, что если вы не ignore_olderукажете опцию в своей конфигурации filebeat, filbeat будет вынужден снова прочитать весь файл elastic.co/guide/en/beats/filebeat/current/…
flazzarini
19

Плагин файл история магазина «размытию» в 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, проверьте номер inode перед вашим файлом ( ls -i yourFile | awk '{print $1}')
  • И перезапустите Logstash

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

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

Дано
источник
1
Относительно start_position => "beginning"документации:> Этот параметр изменяет только ситуации «первого контакта», когда файл новый и ранее не просматривался. Если файл уже просматривался ранее, этот параметр не действует.
Брэд
10

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

Бен Лим
источник
9

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

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

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

vikas027
источник
имейте в виду, что добавление конфигурации ignore_older => 0приведет к обратному.
panchicore
5

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

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
Элваррен
источник
3
Если установлено как пакет, отметьте /var/lib/logstash-forwarder/.
Wesley Baugh
3

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

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

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

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

sincedb_path => "/dev/null" 

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

sincedb_path => "/home/shubham/sinceDB/productsSince.db"
Шубхам Гупта
источник
1

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

GreensterRox
источник
0

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

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

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

Джозеф
источник
0

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

LT
источник
0

Попробуйте удалить /var/lib/logstashпапку в вашем ENV

Раджита Абейсекара
источник
-1

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

<path.data>/plugins/inputs/file

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

foo01
источник