Wie kann man Logstash zwingen, eine Datei zu analysieren?

91

Ich habe Logstash installiert, um Apache-Dateien zu analysieren. Ich habe ziemlich lange gebraucht, um die Einstellungen richtig zu machen, und ich habe immer echte Protokolle anprobiert. Ich habe festgestellt (wie in der Dokumentation angegeben), dass sich logstash "merkt", wo es sich in einer Datei befindet. Jetzt sind meine Einstellungen in Ordnung und ich möchte, dass Logstash "vergisst". Das scheint schwieriger als ich. Ich habe schon folgendes gemacht:

  • gebraucht: start_position => "beginning"

  • löschte den kompletten "Daten" -Ordner aus elastissearch (und stoppte ihn zuerst)

  • schaute nach, welche Dateien von logstash mit geöffnet wurden lsof -p PIDund löschte alles, was vielversprechend war (in meinem Fall /tmp/jffi*.tmp)

Trotzdem vergisst und analysiert Logstash nicht nur "frische" Dateien in dem Ordner, in dem sich die Protokolle befinden

Irgendwelche Ideen?

Christophe Claude
quelle
Neueste Logstash-Version, in der ich sie gefunden habe:/opt/logstash/data/plugins/inputs/file
Tim Smith

Antworten:

135

Standardmäßig schreibt logstash, dass die Position zuletzt in einer Protokolldatei war, in der sich normalerweise befindet $HOME/.sincedb. Logstash kann getäuscht werden, wenn es glaubt, dass es die Protokolldatei nie analysiert hat, indem es /dev/nullals angibt sincedb_path.

Hier der Teil der Dokumentation Input File .

Wo soll die Da-Datenbank geschrieben werden (verfolgt die aktuelle Position der überwachten Protokolldateien). Der Standardwert ist der Wert der Umgebungsvariablen "$ SINCEDB_PATH" oder "$ HOME / .sincedb".

Konfigurationsbeispiel

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
Flazzarini
quelle
28
Unter Windows können Sie sincedb_path => "NUL"den gleichen Effekt erzielen. Details hier
Chris Magnuson
11
Wenn die Dateien ziemlich alt sind (mehr als ingnore_older => 024 Stunden ), ist es sehr nützlich, eine Option hinzuzufügen, damit Logstash sie unabhängig vom Datum übernimmt. Wenn die Dateien älter als 24 Stunden sind, werden sie standardmäßig ignoriert.
MTFK
1
@mtfk: Wow super Fund! Vielen Dank für den Hinweis auf ignore_older => 0Arbeiten in Logstash! Ich habe das gleiche Problem wie der Fragesteller. Scheint ein nicht offensichtlicher Fund zu sein! (googeln "ignore_older" und "logstash" rufen nur Seiten auf filebeat auf, ich konnte keine Spur finden, wie man damit in logstash umgeht)
Mike Lutz
So fügen Sie dies hinzu, während Sie Filebeat verwenden
Sunilkumar Ramamurthy
@ SunilkumarRamamurthy Ich glaube, wenn Sie die Option ignore_olderin Ihrer Filebeat-Konfiguration weglassen, wird Filbeat gezwungen, die gesamte Datei erneut zu lesen. Elastic.co/guide/en/beats/filebeat/current/…
Flazzarini
19

Der Plugin-Dateispeicherverlauf von "tailing" in der sincedb-Datei, Standard: unter $ HOME / .sincedb *, siehe http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Die Da-Datenbank-Datei enthält folgende Zeilen:

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

Wenn Sie also eine vollständige Datei erneut analysieren möchten, müssen Sie:

  • SindedB-Dateien löschen
  • ODER löschen Sie nur die entsprechende Zeile in der sincedb-Datei, überprüfen Sie die Inode-Nummer vor Ihrer Datei ( ls -i yourFile | awk '{print $1}')
  • Und starten Sie Logstash neu

Mit dem Schlüssel start_position => "beginning"analysiert Logstash die gesamte Datei.

Beispiel einer sincedb-Datei:

yesnault
quelle
1
In start_position => "beginning"der Dokumentation heißt es:> Diese Option ändert nur "Erstkontakt" -Situationen, in denen eine Datei neu ist und zuvor nicht gesehen wurde. Wenn eine Datei bereits zuvor gesehen wurde, hat diese Option keine Auswirkung.
Brad
10

Logstash speichert die Aufzeichnung $HOME/.sincedb_*. Sie können alle löschen .sincedbund logstash neu starten. Logstash analysiert die Datei erneut.

Ben Lim
quelle
9

Wenn Sie alle Antworten kombinieren, ist dies der beste Weg, um Dateien zu analysieren. Ich habe das gleiche für meine Tests getan.

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

Für einen schnellen Test können Sie stattdessen ignore_olderauch touch /tmp/access_logden Zeitstempel der Datei ändern.

vikas027
quelle
Beachten Sie, dass das Hinzufügen der Konfiguration ignore_older => 0das Gegenteil bewirkt .
Panchicore
5

Wenn Sie logstash-forwarder verwenden, überprüfen Sie .logstash-forwarderstattdessen Ihr Zuhause auf Datei:

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
elwarren
quelle
3
Wenn als Paket installiert, überprüfen Sie /var/lib/logstash-forwarder/.
Wesley Baugh
3

Nach dem Löschen wurden $HOME/.sincedb_*für mich immer noch keine Daten aufgenommen.

Nachdem ich einige Dinge ausprobiert hatte, entfernte ich alle außer der Hauptdatei .confaus /etc/logstash/conf.dLogstash und startete sie neu, und alles funktionierte. Ich kann nur vermuten, dass sich in einer der .confDateien etwas befand, an dem logstash stillschweigend hing.

Seth
quelle
Soweit ich mich erinnere, schaltete ich später eine Debugging-Flagge ein und sie sagte mir, warum sie wütend war, anstatt still zu hängen. Ich denke, es wurde nach einer Versionsnummer in den Daten gesucht, aber manchmal hatten die Daten keine Nummer. Die Überprüfung, um herauszufinden, was die Nummer war, würde abstürzen, wenn es keine Nummer wäre, also musste ich zuerst testen, ob es eine Nummer war, und dann fragen, welche Nummer es war.
Seth
1

Tatsächlich ist eine erneute Überprüfung jedes Mal sehr kostspielig, wenn die Datei große Datenmengen enthält. Sie müssen also vorsichtig sein, bevor Sie dies tun. Wenn wir eine erneute Analyse erzwingen möchten, setzen Sie den Parameter im Eingabeblock

sincedb_path => "/dev/null" 

Diese Option speichert die .sincedb-Datei nicht und logstash wird jedes Mal neu analysiert. Wenn Sie jedoch gelegentlich nicht jedes Mal eine Analyse durchführen möchten, können Sie den .sinceDb-Pfad, der beim Parsen der Datei erstellt wird, manuell löschen. Im Allgemeinen ist es im Home-Verzeichnis als versteckte Datei vorhanden, wenn Sie kein Root-Benutzer sind, andernfalls im Root-Verzeichnis. Sie können den sincedb_path auch auf einen anderen Speicherort setzen, um diese Datei einfach zu verfolgen.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"
Shubham Gupta
quelle
1

Wenn Sie vermeiden möchten, mit den Logstash-Optionen herumzuspielen, habe ich festgestellt, dass das Umbenennen oder Entfernen der vorhandenen Protokolldatei und das Erstellen einer neuen Datei aus dem alten Dateiinhalt Logstash zur Neuindizierung verleitet.

GreensterRox
quelle
0

Ich habe es in meinem Home-Verzeichnis gefunden, aber nach dem Löschen weigerte sich logstash, die vorhandenen Protokolldateien erneut auszuwählen. Die Art und Weise, wie ich es zum Laufen brachte, war hinzuzufügen

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

zu meinem Datei-Plugin. Ich denke, jedes Mal zurückzusetzen, ändern Sie einfach den Pfad von sincedb_path

Joseph
quelle
0

Wenn Sie tar.gz install filebeat verwenden, können Sie diese Datei löschen $FilebeatPath/data/registry/filebeat/data.jsonund den Filebeat erneut ausführen

LT
quelle
0

Versuchen Sie es, indem Sie den /var/lib/logstashOrdner in Ihrer ENV löschen

Rajitha Abeysekara
quelle
-1

Das neue Verzeichnis von logstash Version 5 befindet sich in

<path.data>/plugins/inputs/file

Die Definition von path.data befindet sich in logstash.yml

foo01
quelle