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?


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"
    }
}

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:


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.


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.


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
  }
}

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ł.


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"

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.


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


0

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



-1

logstash w wersji 5 nowy katalog jest w

<path.data>/plugins/inputs/file

Definicja path.data znajduje się w logstash.yml

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.