Bagaimana cara menangani beberapa input heterogen dengan Logstash?

95

Katakanlah Anda memiliki 2 jenis log yang sangat berbeda seperti log teknis dan bisnis dan Anda menginginkan:

  • log teknis mentah diarahkan ke server greylog2 menggunakan gelfoutput,
  • log bisnis json disimpan ke dalam klaster elasticsearch menggunakan elasticsearch_httpkeluaran khusus .

Saya tahu bahwa dengan Syslog-NGmisalnya, file konfigurasi memungkinkan untuk menentukan beberapa input berbeda yang kemudian dapat diproses secara terpisah sebelum dikirim; apa yang Logstashtampaknya tidak bisa dilakukan. Meskipun satu instance dapat dimulai dengan dua file konfigurasi tertentu, semua log mengambil saluran yang sama dan menerapkan proses yang sama ...

Haruskah saya menjalankan instance sebanyak saya memiliki jenis log yang berbeda?

David
sumber
2
Anda harus menerima jawaban yang benar dari Ben Lim!
Ben Wheeler

Jawaban:

191

Haruskah saya menjalankan instance sebanyak saya memiliki jenis log yang berbeda?

Tidak! Anda hanya dapat menjalankan satu instance untuk menangani berbagai jenis log.

Di file konfigurasi logstash, Anda dapat menentukan setiap input dengan tipe yang berbeda . Kemudian di filter Anda dapat menggunakan if untuk pemrosesan yang berbeda, dan juga pada output Anda dapat menggunakan "jika" output ke tujuan yang berbeda.

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

Semoga ini bisa membantu Anda :)

Ben Lim
sumber
1
Anda juga dapat menggunakan typeatribut (dengan type => "value"sintaks yang sama ) dalam definisi filter dan keluaran yang akan mengurangi pemformatan ekstra di dalam file konfigurasi sedikit. Contoh: gist.github.com/fairchild/3030472 Per dokumentasi: Tambahkan bidang 'jenis' ke semua peristiwa yang ditangani oleh masukan ini. Jenis digunakan terutama untuk aktivasi filter. Jenis disimpan sebagai bagian dari acara itu sendiri, sehingga Anda juga dapat menggunakan jenis untuk menelusurinya di antarmuka web.
Tony Cesaro
5
Yah, sepertinya yang diberikan Ben sebenarnya cara baru untuk melakukan ini. Saat saya menggunakan type => "value"output, saya mendapatkan pesan berikut yang ditampilkan: "Anda menggunakan setelan konfigurasi yang tidak digunakan lagi" type "yang disetel di stdout. Setelan yang tidak berlaku lagi akan terus berfungsi, tetapi dijadwalkan untuk dihapus dari logstash di masa mendatang. Anda dapat melakukannya perilaku yang sama ini dengan persyaratan baru, seperti: if [type] == "sometype" { stdout { ... } }". Saya menarik kembali komentar saya sebelumnya. :)
Tony Cesaro
Perhatikan bahwa typeatribut tidak akan berlaku jika sudah ada bidang tipe dari masukan. Ini adalah atribut khusus yang tidak menimpa dan didokumentasikan. Saya membuka tiket di Elastic dan mereka merekomendasikan saya untuk menggunakan tagsatau add_fieldalih-alihtype
BornToCode
@BornToCode, saya tidak begitu mengerti. Apakah Anda mengatakan ada yang salah dengan kode Ben? Atau tidak akan berhasil jika jalur log adalah file yang sama? Apa skenario yang tidak berhasil?
Ben Wheeler
2
@BenLim OP tidak menerima jawaban Anda, tetapi menurut saya paling membantu dan memilih Anda.
bigbadmouse
15

Saya menggunakan tag untuk beberapa input file:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}
Robin Wang
sumber
Ini lebih baik daripada jawaban yang diterima: ini memungkinkan beberapa input pemukulan file di logstash. Dalam kasus seperti itu, properti "type" disetel ke "log" dan tidak dapat diubah.
Régis B.
Tapi bukankah ini menimpa tag dengan tag terakhir (bbb)? Dan sekali lagi, di statemt if, jika tag adalah larik atau string tunggal, maka kedua IF akan berfungsi. Jadi secara logis ini tidak benar, tetapi mungkin logstash memiliki logika yang berbeda di dalam if's
meso_2600
0

Saya pikir logstash tidak dapat membaca lebih dari 2 file di bagian Input. coba di bawah ini

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
sumber
Yup, mengalami 'masalah' yang sama
meso_2600