Bagaimana cara memaksa Logstash untuk mem-reparse file?

91

Saya menginstal Logstash untuk mengurai file apache. Saya butuh waktu cukup lama untuk mendapatkan pengaturan yang benar dan saya selalu mencoba pada log nyata. Saya melihat (seperti yang dikatakan dalam dokumentasi) bahwa logstash "mengingat" di mana ia berada dalam sebuah file. Sekarang pengaturan saya baik-baik saja dan saya ingin Logstash "lupa". Ini tampaknya lebih sulit dari saya. Saya sudah melakukan hal berikut:

  • bekas: start_position => "beginning"

  • menghapus folder "data" lengkap dari elastissearch (dan menghentikannya dulu)

  • melihat file mana yang dibuka oleh logstash dengan lsof -p PIDdan menghapus semua yang menjanjikan (dalam kasus saya /tmp/jffi*.tmp)

Masih Logstash tidak melupakan dan hanya mengurai file "segar" di folder tempat log berada

Ada ide?

Christophe Claude
sumber
Versi logstash terbaru Saya menemukannya di:/opt/logstash/data/plugins/inputs/file
Tim Smith

Jawaban:

135

Secara default, logstash menulis posisi terakhir pada logfile yang biasanya berada di $HOME/.sincedb. Logstash dapat dibodohi dengan meyakini bahwa Logstash tidak pernah mengurai logfile dengan menetapkan /dev/nullsebagai sincedb_path.

Di sini bagian dari File Input dokumentasi .

Tempat untuk menulis database sejak (melacak posisi saat ini dari file log yang dipantau). Secara default, nilai variabel lingkungan "$ SINCEDB_PATH" atau "$ HOME / .sincedb".

Contoh Config

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
flazzarini
sumber
29
Di jendela, Anda dapat menggunakan sincedb_path => "NUL"untuk mendapatkan efek yang sama. Detailes di sini
Chris Magnuson
11
Jika file cukup lama (lebih dari 24 jam) sangat berguna adalah menambahkan opsi ingnore_older => 0sehingga logstash akan membawanya ke manapun tanggalnya. Secara default jika file lebih lama maka 24 jam akan diabaikan.
mtfk
1
@mtfk: Wow, luar biasa! Terima kasih telah menunjukkan ignore_older => 0karya di logstash! Saya telah mengalami masalah yang sama dengan si penanya. Tampaknya penemuan yang tidak jelas! (Googling "ignore_older" dan "logstash" hanya menampilkan halaman di filebeat, saya tidak dapat menemukan jejak bagaimana menangani ini di logstash)
Mike Lutz
Bagaimana menambahkan ini saat menggunakan filebeat
Sunilkumar Ramamurthy
@SunilkumarRamamurthy Saya percaya jika Anda meninggalkan pilihan ignore_olderdalam konfigurasi filebeat Anda, filbeat dipaksa untuk membaca seluruh file lagi elastic.co/guide/en/beats/filebeat/current/...
flazzarini
19

File plugin menyimpan riwayat "tailing" dalam file sincedb, default: di bawah $ HOME / .sincedb *, lihat http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

File sejak db berisi tampilan baris seperti:

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

Jadi, jika Anda ingin mengurai kembali file lengkap, Anda perlu:

  • hapus file sindedb
  • ATAU hanya hapus baris yang sesuai di file sincedb, periksa nomor inode sebelum file Anda ( ls -i yourFile | awk '{print $1}')
  • Dan mulai ulang Logstash

Dengan kuncinya start_position => "beginning", Logstash akan menganalisis semua file.

Contoh file sincedb:

yesnault
sumber
1
Mengenai start_position => "beginning", dokumentasinya mengatakan:> Opsi ini hanya mengubah situasi "kontak pertama" di mana sebuah file baru dan tidak terlihat sebelumnya. Jika file sudah pernah dilihat sebelumnya, opsi ini tidak berpengaruh.
Brad
10

Logstash akan menyimpan catatan tersebut $HOME/.sincedb_*. Anda dapat menghapus semua .sincedbdan restart logstash, Logstash akan mengembalikan file tersebut.

Ben Lim
sumber
9

Menggabungkan semua jawaban, tebak ini adalah cara terbaik untuk mengurai file. Saya melakukan hal yang sama untuk pengujian saya.

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

Untuk pengujian cepat ignore_older, Anda juga touch /tmp/access_logdapat mengubah stempel waktu file.

vikas027
sumber
Ketahuilah bahwa menambahkan konfigurasi ignore_older => 0akan menghasilkan hal yang sebaliknya.
panchicore
5

Jika Anda menggunakan logstash-forwarder, periksa .logstash-forwarderfile rumah Anda :

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
elwarren
sumber
3
Jika diinstal sebagai paket, periksa /var/lib/logstash-forwarder/.
Wesley Baugh
3

Setelah menghapusnya, $HOME/.sincedb_*itu masih tidak menelan data untuk saya.

Setelah mencoba banyak hal, saya menghapus semua kecuali .conffile utama dari /etc/logstash/conf.ddan memulai kembali Logstash, dan semuanya berfungsi. Saya hanya bisa berasumsi ada sesuatu di salah satu .conffile yang logstash diam-diam tergantung.

Seth
sumber
Seingat saya, saya kemudian menyalakan beberapa bendera debugging dan itu memberi tahu saya mengapa itu marah daripada tergantung diam-diam. Saya pikir itu mencari nomor versi di data tetapi terkadang data tidak memiliki nomor di dalamnya. Pengecekan untuk mengetahui nomor apa itu akan crash jika bukan angka, jadi saya harus mengujinya terlebih dahulu lalu menanyakan nomornya.
Seth
1

Sebenarnya melakukan reparsing setiap kali sangat mahal jika file tersebut memiliki data yang besar. Jadi Anda perlu berhati-hati sebelum melakukan ini. Jika kita ingin memaksanya mengulang lagi maka atur parameter di dalam blok input

sincedb_path => "/dev/null" 

Opsi ini tidak akan menyimpan file .sincedb dan logstash akan mengulang setiap kali. Tetapi jika Anda ingin mengulang sesekali tidak setiap kali maka yang dapat Anda lakukan adalah menghapus secara manual jalur .sinceDb yang dibuat saat mem-parsing file. Umumnya file ini ada di direktori home sebagai file tersembunyi jika Anda bukan pengguna root, sebaliknya di direktori root. Anda juga dapat menyetel sincedb_path ke beberapa lokasi lain untuk melacak file ini dengan mudah.

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

Jika Anda ingin menghindari mengotak-atik opsi logstash, saya telah menemukan bahwa mengganti nama atau menghapus file log yang ada dan membuat file baru dari konten file lama akan menipu logstash untuk mengindeks ulang.

GreensterRox
sumber
0

Saya menemukannya di direktori home saya tetapi setelah menghapusnya, logstash menolak untuk memilih kembali file log yang ada. Cara saya membuatnya bekerja adalah menambahkan

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

ke plugin file saya. Saya pikir untuk mengatur ulang setiap kali, cukup ubah jalur sincedb_path

Joseph
sumber
0

jika Anda menggunakan tar.gz install filebeat, Anda dapat menghapus file ini $FilebeatPath/data/registry/filebeat/data.json, dan menjalankan kembali filebeat

LT
sumber
0

Coba dengan menghapus /var/lib/logstashfolder di ENV Anda

Rajitha Abeysekara
sumber
-1

logstash versi 5 direktori baru masuk

<path.data>/plugins/inputs/file

definisi path.data ada di logstash.yml

foo01
sumber