Як змусити Logstash перепрофілювати файл?


91

Я встановив Logstash для синтаксичного аналізу файлів apache. У мене було достатньо часу, щоб правильно налаштувати, і я завжди приміряв реальні журнали. Я помітив (як сказано в документації), що logstash "запам'ятовує", де знаходився у файлі. Зараз мої налаштування в порядку, і я хотів би, щоб Logstash "забув". Це здається важчим, ніж я. Я вже зробив наступне:

  • використовується: start_position => "beginning"

  • видалив повну папку "дані" з 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.

Тут частина вхідного файлу документації .

Куди писати базу даних since (відстежує поточну позицію відстежуваних файлів журналів). За замовчуванням значення змінної середовища "$ SINCEDB_PATH" або "$ HOME / .sincedb".

Приклад налаштування

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

28
На вікнах ви можете sincedb_path => "NUL"отримати той самий ефект. Детальніше тут
Кріс Магнусон

11
Якщо файли досить старі (більше 24 годин), дуже корисно додати опцію, ingnore_older => 0щоб logstash брав їх незалежно від дати. За замовчуванням, якщо файли старіші, 24 години будуть ігноруватися.
mtfk

1
@mtfk: Вау дивовижна знахідка! Дякуємо, що ignore_older => 0вказали на твори в logstash! Мене заклинила та сама проблема, що і запитувача. Здається, неочевидна знахідка! (googling "ignore_older" і "logstash" викликають лише сторінки на filebeat, я не міг знайти жодного сліду, як з цим боротися в logstash)
Майк Луц

Як додати це під час використання filebeat
Sunilkumar

@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, який створюється при аналізі файлу. Як правило, він присутній у домашньому каталозі як прихований файл, якщо ви не є кореневим користувачем, інакше в кореневому каталозі. Ви також можете встановити 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.