Jak zmusić Logstash do ponownej analizy pliku?

91

Zainstalowałem Logstash, aby przeanalizować pliki Apache. Prawidłowe ustawienie zajęło mi sporo czasu i zawsze próbowałem na prawdziwych dziennikach. Zauważyłem (jak mówi dokumentacja), że logstash „pamięta” gdzie był w pliku. Teraz moje ustawienia są OK i chciałbym, żeby Logstash „zapomniał”. Wydaje się to trudniejsze niż myślałem. Zrobiłem już następujące rzeczy:

  • używany: start_position => "beginning"

  • usunął cały folder „data” z elastissearch (i najpierw go zatrzymał)

  • sprawdziłem, które pliki zostały otwarte przez logstash lsof -p PIDi usunąłem wszystko, co było obiecujące (w moim przypadku /tmp/jffi*.tmp)

Mimo to Logstash nie zapomina i analizuje tylko „świeże” pliki w folderze, w którym znajdują się dzienniki

Jakieś pomysły?

Christophe Claude
źródło
Najnowsza wersja logstashu, którą znalazłem w:/opt/logstash/data/plugins/inputs/file
Tim Smith

Odpowiedzi:

135

Domyślnie logstash zapisuje ostatnią pozycję w pliku dziennika, w którym zwykle znajduje się $HOME/.sincedb. Logstash można oszukać, wierząc, że nigdy nie przeanalizował pliku dziennika, określając /dev/nulljako sincedb_path.

Tutaj część dokumentacji Input File .

Gdzie zapisać bazę danych od (śledzi aktualną pozycję monitorowanych plików dziennika). Domyślnie wartość zmiennej środowiskowej „$ SINCEDB_PATH” lub „$ HOME / .sincedb”.

Przykład konfiguracji

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
flazzarini
źródło
29
W oknach możesz użyć, sincedb_path => "NUL"aby uzyskać ten sam efekt. Szczegóły tutaj
Chris Magnuson
11
Jeśli pliki są dość stare (ponad 24 h), bardzo przydatne jest dodanie opcji, ingnore_older => 0aby logstash je pobierał bez względu na datę. Domyślnie, jeśli pliki są starsze, 24 godziny będą ignorowane.
mtfk
1
@mtfk: Wow, niesamowite znalezisko! Dzięki za wskazanie ignore_older => 0prac w logstash! Zostałem zablokowany przez ten sam problem, co pytający. Wydaje się, że to nieoczywiste znalezisko! (googlowania „ignore_older” i „logstash” tylko wychowywać stron na filebeat, nie mogłem znaleźć żadnego śladu, jak radzić sobie z tym w logstash)
Mike Lutz
Jak to dodać podczas korzystania z filebeat
Sunilkumar Ramamurthy
@SunilkumarRamamurthy Wierzę, że jeśli pominąć opcję ignore_olderw konfiguracji filebeat, filbeat zmuszona jest odczytać cały plik ponownie elastic.co/guide/en/beats/filebeat/current/...
flazzarini
19

Plik wtyczki przechowuje historię „tailingu” w pliku sincedb, domyślnie: w $ HOME / .sincedb *, zobacz http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Ponieważ plik db zawiera linię wygląda następująco:

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

Tak więc, jeśli chcesz ponownie przeanalizować cały plik, musisz:

  • usuń pliki sindedb
  • LUB usuń tylko odpowiednią linię w pliku sincedb, sprawdź numer i-węzła przed swoim plikiem ( ls -i yourFile | awk '{print $1}')
  • I uruchom ponownie Logstash

Za pomocą klucza start_position => "beginning"Logstash przeanalizuje cały plik.

Przykład pliku sincedb:

taknault
źródło
1
Jeśli chodzi start_position => "beginning"o dokumentację, mówi się:> Ta opcja modyfikuje tylko sytuacje „pierwszego kontaktu”, w których plik jest nowy i nie był wcześniej widziany. Jeśli plik był już wcześniej widziany, ta opcja nie działa.
Brad
10

Logstash zachowa zapis w formacie $HOME/.sincedb_*. Możesz usunąć wszystkie .sincedbi ponownie uruchomić logstash, Logstash ponownie przeanalizuje plik.

Ben Lim
źródło
9

Łącząc wszystkie odpowiedzi, myślę, że jest to najlepszy sposób analizowania plików. Zrobiłem to samo podczas testów.

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

W celu szybkiego testu ignore_oldermożesz zamiast tego touch /tmp/access_logzmienić sygnaturę czasową pliku.

vikas027
źródło
pamiętaj, że dodanie konfiguracji ignore_older => 0będzie miało odwrotny skutek.
panchicore,
5

Jeśli używasz logstash-forwarder, poszukaj .logstash-forwarderpliku w katalogu domowym :

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
elwarren
źródło
3
Jeśli jest zainstalowany jako pakiet, sprawdź /var/lib/logstash-forwarder/.
Wesley Baugh,
3

Po usunięciu $HOME/.sincedb_*nadal nie przetwarzał danych dla mnie.

Po wypróbowaniu wielu rzeczy usunąłem z niego wszystko oprócz głównego .confpliku /etc/logstash/conf.di ponownie uruchomiłem Logstash i wszystko działało. Mogę tylko założyć, że w jednym z .confplików było coś, na czym logstash po cichu wisiał.

Seth
źródło
O ile pamiętam, później włączyłem jakąś flagę debugowania i powiedziała mi, dlaczego jest zły, a nie cicho wisiał. Myślę, że szukał numeru wersji w danych, ale czasami dane nie zawierały numeru. Sprawdzanie, co to za liczba, zawiesza się, jeśli nie jest to liczba, więc musiałem najpierw sprawdzić, czy to liczba, a następnie zapytać, jaka to liczba.
Seth
1

Właściwie naprawianie za każdym razem jest bardzo kosztowne, jeśli plik zawiera duże ilości danych. Więc zanim to zrobisz, musisz być ostrożny. Jeśli chcemy zmusić go do ponownej analizy, ustaw parametr wewnątrz bloku wejściowego

sincedb_path => "/dev/null" 

Ta opcja nie będzie przechowywać pliku .sincedb, a logstash będzie ponownie analizował za każdym razem. Ale jeśli chcesz od czasu do czasu dokonać ponownej analizy, a nie za każdym razem, możesz ręcznie usunąć ścieżkę .sinceDb, która jest tworzona podczas analizowania pliku. Zwykle jest obecny w katalogu domowym jako plik ukryty, jeśli nie jesteś użytkownikiem root, w przeciwnym razie w katalogu głównym. Możesz również ustawić sincedb_path na inną lokalizację, aby łatwo śledzić ten plik.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"
Shubham Gupta
źródło
1

Jeśli chcesz uniknąć mieszania się z opcjami logstash, odkryłem, że zmiana nazwy lub usunięcie istniejącego pliku dziennika i utworzenie nowego pliku ze starej zawartości pliku spowoduje, że logstash zostanie ponownie zindeksowany.

GreensterRox
źródło
0

Znalazłem go w moim katalogu domowym, ale po usunięciu go, logstash odmówił ponownego pobrania istniejących plików dziennika. Sposób, w jaki to działało, polegał na dodawaniu

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

do mojej wtyczki pliku. Myślę, że za każdym razem resetuję, po prostu zmień ścieżkę sincedb_path

Józefa
źródło
0

jeśli używasz tar.gz install filebeat, możesz usunąć ten plik $FilebeatPath/data/registry/filebeat/data.jsoni ponownie uruchomić plik filebeat

LT
źródło
0

Spróbuj, usuwając /var/lib/logstashfolder w swoim ENV

Rajitha Abeysekara
źródło
-1

logstash w wersji 5 nowy katalog jest w

<path.data>/plugins/inputs/file

Definicja path.data znajduje się w logstash.yml

foo01
źródło