Logstash 6.4.1 (и выше) «logstash-input-file», использующий режим «read», не работает должным образом / желательно в macOS - PullRequest
0 голосов
/ 24 сентября 2018

Итак, у меня довольно скромная настройка Logstash для журналов Apache, которую я использую в RedHat 7 (производственная), а также macOS High Sierra (10.13.6) для разработки, и что-то странное произошло после обновления с Logstash версии 6.3.2до 6.4.1.Я использую Homebrew на macOS для установки и обновления Logstash, и эти проблемы не исчезают, даже если я «разберусь» свои установленные элементы Hombrew и переустановлю.

Прямо в точку.

Проще говоря, статические данныевходные файлы не читаются и не принимаются при запуске в 6.4.1, как это было раньше в 6.3.2 и ранее.Для 6.4.1 мне нужно вручную cat записать строки в целевой путь, чтобы Logstash «проснулся» и забрать эти новые строки, даже если я назначу новый режим read.

В концесегодня эта настройка не нуждается в настройке sincedb и может быть перезапущена и прочитана из заголовка файла до конца, и мы все счастливы ... По крайней мере, до Logstash 6.4.1 ... Теперь никто не счастлив.Что можно сделать, чтобы Logstash всегда считывал данные с начала файлов, несмотря ни на что?

Подробности и обнаружение.

Используемая мной настройка Logstash просто делаетнекоторая фильтрация логов Apache для ввода.Входная конфигурация, которую я использую, выглядит следующим образом;обратите внимание, что путь к файлу слегка подправлен для обеспечения конфиденциальности, но по сути это именно то, что я использую сейчас и использую в течение последнего года или около того без проблем:

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    ignore_older => 0
    close_older => 3600
    stat_interval => 1
    discover_interval => 15
  }

}

То, как я использую это для локальныхразработка заключается в том, чтобы просто получить копию удаленных журналов сервера Apache и поместить их в этот каталог /opt/logstash/coolapp/.

Затем, когда я запускаю Logstash через командную строку, как это, с установленным зельем -f, поэтому мой coolapp-apache.confчитается:

logstash -f coolapp-apache.conf

Logstash запускается локально, выдает всю свою кучу сообщений о состоянии запуска до последнего сообщения:

[2018-09-24T12:40:09,458][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

Что для меня означает, что он полностью запущен и работаети проверка выходных данных моего сбора данных показывает - если он работает - поток данных, поступающих ... Но при использовании Logstash 6.4.1 я не вижу данных, поступающих.

Плагин для ввода файлов работает в режиме tail.

Проверка обновленной документации для модуля ввода файлов (v4.1.5) показывает , есть новая опция mode , которая имеет readрежим и режим tail.Зная, что режим по умолчанию - tail, я протестировал настройку, выполнив следующие действия после запуска моей локальной настройки отладки Logstash.Сначала я скопировал access_log следующим образом:

cp /opt/logstash/coolapp/access_log /opt/logstash/coolapp/access_log_BAK

Затем я обнулел основной файл access_log, используя :> следующим образом:

:> /opt/logstash/coolapp/access_log

И наконец я просто запустилcat и добавил данные этого скопированного файла в исходный файл следующим образом:

cat /opt/logstash/coolapp/access_log_BAK > /opt/logstash/coolapp/access_log

Когда я это сделал, во-вторых, данные начали течь, как и ожидалось!Я полагаю, новый плагин для ввода файлов ориентирован на tailing a file more than чтение?Во всяком случае, это работает, но явно раздражает.Я не развиваюсь так.Мне нужен Logstash, чтобы просто читать файлы и анализировать их.

Плагин для ввода файлов не работает в режиме read.

Поэтому я попытался использовать следующую настройку, чтобы просто прочитать файлы основываясь на том, что я увидел в официальном файле Logstash, введите mode документацию :

input {

  file {
    path => "/opt/logstash/coolapp/access_log"
    mode => "read"
    file_completed_action => "log"
    file_completed_log_path => "/Users/jakegould/Desktop/access_log_foo"
  }

}

Конечно, такие вещи, как access_log_foo, предназначены только для проверки имени файла для тестирования, но когдавсе сказано и сделано, этот режим read совершенно не работает на macOS.Я даже пытался изменить path на что-то вроде моего рабочего стола, и это не работает.И весь трюк «обнулить, а затем добавить файл», который я использовал, как объяснено в объяснении «хвостовой режим», здесь не подходит, поскольку файл не tail ed, я полагаю?

Итакзная все это:

Что можно сделать, чтобы Logstash 6.4.1 всегда считывал данные с начала файлов, независимо от того, как это было раньше в Logstash версии 6.3.2а предыдущий?

1 Ответ

0 голосов
/ 20 ноября 2018

Хорошо, я понял это.Сейчас я нахожусь на Logstash 6.5, и моя первоначальная конфигурация была следующей:

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    ignore_older => 0
    close_older => 3600
    stat_interval => 1
    discover_interval => 15
  }

}

Когда я переделал его, избавился от ignore_older и настроил close_older и stat_interval для использования string_duration все снова заработало, как и ожидалось.

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    close_older => "1 hour"
    stat_interval => "1 second"
    discover_interval => 15
  }

}

Я предполагаю, что Logstash 6.3.2 интерпретировал ignore_older как 0 как false, таким образом отключая ignore_older, но в версии 6.4и чем выше это значение теперь интерпретируется как фактическое значение времени в секундах?Я не копался глубоко в исходном коде, но все, что я испытал, указывает на эту проблему.

Несмотря на это, эта конфигурация теперь работает, и я запускаю Logstash 6.5 на macOS Mojave (10.14.1) без каких-либовопросы.

...