Как заставить 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"
    }
}

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можете изменить метку времени файла.


имейте в виду, что добавление конфигурации 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 повторно проиндексировать.


0

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

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

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


0

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



-1

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

<path.data>/plugins/inputs/file

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.