Come gestire più input eterogenei con Logstash?


95

Supponiamo che tu abbia 2 tipi di log molto diversi come log tecnici e aziendali e desideri:

  • i registri tecnici grezzi vengono instradati verso un server graylog2 utilizzando un gelfoutput,
  • I registri aziendali json possono essere archiviati in un cluster elasticsearch utilizzando l' elasticsearch_httpoutput dedicato .

So che con, Syslog-NGad esempio, il file di configurazione consente di definire diversi input distinti che possono essere elaborati separatamente prima di essere inviati; ciò che Logstashsembra incapace di fare. Anche se un'istanza può essere avviata con due file di configurazione specifici, tutti i log prendono lo stesso canale e vengono applicate le stesse elaborazioni ...

Devo eseguire tante istanze quanti sono i diversi tipi di log?


2
Dovresti accettare la risposta corretta di Ben Lim!
Ben Wheeler

Risposte:


191

Devo eseguire tante istanze quanti sono i diversi tipi di log?

No! Puoi eseguire solo un'istanza per gestire diversi tipi di log.

Nel file di configurazione logstash, è possibile specificare ogni input con un tipo diverso . Quindi nel filtro puoi usare if per distinguere elaborazioni diverse, e anche all'output puoi usare output "if" per destinazioni diverse.

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

Spero che questo possa aiutarti :)


1
Puoi anche usare l' typeattributo (con la stessa type => "value"sintassi) nel filtro e nelle definizioni di output che dovrebbero ridurre un po 'la formattazione extra all'interno del file di configurazione. Esempio: gist.github.com/fairchild/3030472 Come da documentazione: aggiungi un campo "tipo" a tutti gli eventi gestiti da questo input. I tipi vengono utilizzati principalmente per l'attivazione del filtro. Il tipo viene memorizzato come parte dell'evento stesso, quindi puoi anche utilizzare il tipo per cercarlo nell'interfaccia web.
Tony Cesaro

5
Bene, sembra che quello che Ben ha fornito sia in realtà il nuovo modo per farlo. Quando l'ho utilizzato type => "value"in un output, è stato visualizzato il seguente messaggio: "Stai utilizzando un'impostazione di configurazione obsoleta" tipo "impostata in stdout. Le impostazioni obsolete continueranno a funzionare, ma sono pianificate per la rimozione dal registro in futuro. Puoi ottenere lo stesso comportamento con i nuovi condizionali, come:. if [type] == "sometype" { stdout { ... } }" Ritiro il mio commento precedente. :)
Tony Cesaro

Tieni presente che l' typeattributo non verrà applicato se è già presente un campo tipo dall'input. Questo è un attributo speciale che non sostituisce ed è documentato. Ho aperto un ticket in Elastic e mi hanno consigliato di usare tagso al add_fieldposto ditype
BornToCode

@BornToCode, non capisco bene. Stai dicendo che c'è qualcosa che non va nel codice di Ben? O che non funzionerebbe se i percorsi dei log fossero lo stesso file? Qual è lo scenario in cui non funziona?
Ben Wheeler

2
@ BenLim L'OP non ha accettato la tua risposta ma l'ho trovata molto utile e ti ho votato.
bigbadmouse

15

Ho usato tag per più file di input:

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

Questa è migliore della risposta accettata: consente più input di filebeat nel logstash. In questi casi, la proprietà "tipo" è impostata su "log" e non può essere modificata.
Régis B.

Ma questo non è sovrascrivere i tag con l'ultimo tag (bbb)? E poi di nuovo, in if statememt, se i tag fossero un array o una singola stringa, allora entrambi gli IF funzionerebbero. Quindi logicamente questo non è corretto, ma forse logstash ha una logica diversa all'interno di if
meso_2600

0

Penso che logstash non possa leggere più di 2 file nella sezione Input. prova il seguito

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 

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.