Come forzare Logstash ad analizzare un file?


91

Ho installato Logstash per analizzare i file Apache. Mi ci è voluto un po 'di tempo per ottenere le impostazioni corrette e ho sempre provato su registri reali. Ho notato (come dice la documentazione) che logstash "ricorda" dove si trovava in un file. Ora le mie impostazioni sono OK e vorrei che Logstash "dimenticasse". Questo sembra più difficile di me però. Ho già fatto quanto segue:

  • Usato: start_position => "beginning"

  • cancellato la cartella "dati" completa da elastissearch (e fermato prima)

  • ha esaminato quali file sono stati aperti da logstash lsof -p PIDe cancellato tutto ciò che era promettente (nel mio caso /tmp/jffi*.tmp)

Ancora Logstash non dimentica e analizza solo i file "freschi" nella cartella in cui si trovano i registri

Qualche idea?


L'ultima versione di logstash l'ho trovata in:/opt/logstash/data/plugins/inputs/file
Tim Smith

Risposte:


135

Per impostazione predefinita, logstash scrive l'ultima posizione in un file di log che di solito risiede $HOME/.sincedb. Logstash può essere ingannato facendogli credere di non aver mai analizzato il file di log specificando /dev/nullcome sincedb_path.

Qui la parte del file di input della documentazione .

Dove scrivere il database dal (tiene traccia della posizione corrente dei file di registro monitorati). Il valore predefinito è il valore della variabile d'ambiente "$ SINCEDB_PATH" o "$ HOME / .sincedb".

Esempio di configurazione

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

28
Su Windows puoi usare sincedb_path => "NUL"per ottenere lo stesso effetto. Dettagli qui
Chris Magnuson,

11
Se i file sono piuttosto vecchi (più di 24 ore) molto utile è aggiungere un'opzione in ingnore_older => 0modo che logstash li prenda indipendentemente dalla data. Per impostazione predefinita, se i file sono più vecchi, le 24 ore verranno ignorate.
mtfk

1
@mtfk: Wow fantastica scoperta! Grazie per aver sottolineato i ignore_older => 0lavori in logstash! Sono stato bloccato dallo stesso problema dell'interrogante. Sembra essere una scoperta non ovvia! (googling "ignore_older" e "logstash" fanno apparire solo pagine su filebeat, non sono riuscito a trovare alcuna traccia di come gestirlo nel logstash)
Mike Lutz

Come aggiungerlo durante l'utilizzo di filebeat
Sunilkumar Ramamurthy

@SunilkumarRamamurthy Credo che se lasci l'opzione ignore_oldernella tua configurazione di filebeat, filbeat è costretto a leggere di nuovo l'intero file elastic.co/guide/en/beats/filebeat/current/…
flazzarini

19

Il file del plugin memorizza la cronologia del "tailing" nel file sincedb, predefinito: sotto $ HOME / .sincedb *, vedere http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Il file poiché db contiene la riga ha questo aspetto:

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

Quindi, se vuoi analizzare di nuovo un file completo, devi:

  • eliminare i file sindedb
  • OPPURE elimina solo la riga corrispondente nel file sincedb, controlla il numero di inode prima del tuo file ( ls -i yourFile | awk '{print $1}')
  • E riavvia Logstash

Con la chiave start_position => "beginning", Logstash analizzerà tutto il file.

Esempio di un file sincedb:


1
Riguardo start_position => "beginning", la documentazione dice:> Questa opzione modifica solo le situazioni di "primo contatto" in cui un file è nuovo e non visto prima. Se un file è già stato visto prima, questa opzione non ha effetto.
Brad

10

Logstash manterrà il record in formato $HOME/.sincedb_*. È possibile eliminare tutto .sincedbe riavviare il logstash, Logstash analizzerà il file.


9

Combinando tutte le risposte, immagino che questo sia il modo migliore per analizzare i file. Ho fatto lo stesso per i miei test.

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

Per un rapido test, invece di ignore_older, puoi anche touch /tmp/access_logmodificare il timestamp del file.


essere consapevoli che l'aggiunta della configurazione ignore_older => 0farà il contrario.
panchicore

5

Se stai usando logstash-forwarder, controlla invece la tua home per il .logstash-forwarderfile:

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}

3
Se installato come pacchetto, controlla /var/lib/logstash-forwarder/.
Wesley Baugh

3

Dopo $HOME/.sincedb_*averlo eliminato, non veniva ancora importato dati per me.

Dopo aver provato un sacco di cose, ho rimosso tutto tranne il .conffile principale /etc/logstash/conf.de riavviato Logstash, e tutto ha funzionato. Posso solo presumere che ci fosse qualcosa in uno dei .conffile su cui logstash era sospeso silenziosamente.


Per quanto ricordo, in seguito ho attivato un flag di debug e mi ha detto perché era arrabbiato piuttosto che sospeso silenziosamente. Penso che stesse cercando un numero di versione nei dati, ma a volte i dati non contenevano un numero. Il controllo per scoprire quale fosse il numero si sarebbe bloccato se non fosse un numero, quindi ho dovuto prima testare che fosse un numero e poi chiedere quale numero fosse.
Seth

1

In realtà la riparazione ogni volta è molto costosa se il file contiene dati di grandi dimensioni. Quindi devi stare attento prima di farlo. Se vogliamo forzare il riesame di nuovo, impostare il parametro all'interno del blocco di input

sincedb_path => "/dev/null" 

Questa opzione non memorizzerà il file .sincedb e logstash verrà rieseguito ogni volta. Ma se vuoi rianalizzare occasionalmente non ogni volta, quello che puoi fare è eliminare manualmente il percorso .sinceDb che viene creato durante l'analisi del file. Generalmente è presente nella directory home come file nascosto se non sei un utente root altrimenti nella directory root. È inoltre possibile impostare sincedb_path su un'altra posizione per tracciare facilmente questo file.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"

1

Se vuoi evitare di fare confusione con le opzioni di logstash, ho scoperto che rinominare o rimuovere il file di log esistente e creare un nuovo file dal vecchio contenuto del file ingannerà il logstash nella reindicizzazione.


0

L'ho trovato nella mia directory home ma dopo averlo eliminato, logstash si è rifiutato di selezionare nuovamente i file di registro esistenti. Il modo in cui riuscivo a far funzionare era aggiungere

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

al mio plugin di file. Penso di resettare ogni volta, basta cambiare il percorso di sincedb_path


0

se utilizzi tar.gz install filebeat, puoi eliminare questo file $FilebeatPath/data/registry/filebeat/data.json, e rieseguire il filebeat



-1

logstash versione 5 nuova directory è in

<path.data>/plugins/inputs/file

La definizione di path.data è in logstash.yml

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.