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?


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

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:


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.


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.


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

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.


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"

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.


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


0

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



-1

logstash versi 5 direktori baru masuk

<path.data>/plugins/inputs/file

definisi path.data ada di logstash.yml

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.