Jak obsłużyć wiele heterogenicznych danych wejściowych za pomocą Logstash?

95

Załóżmy, że masz 2 bardzo różne typy dzienników, takie jak dzienniki techniczne i biznesowe, i chcesz:

  • surowe logi techniczne są kierowane do serwera graylog2 za pomocą gelfwyjścia,
  • Dzienniki biznesowe json są przechowywane w klastrze Flexiblesearch przy użyciu dedykowanych elasticsearch_httpdanych wyjściowych.

Wiem, że Syslog-NGna przykład plik konfiguracyjny pozwala zdefiniować kilka różnych danych wejściowych, które następnie mogą być przetwarzane oddzielnie przed wysłaniem; co Logstashwydaje się niemożliwe. Nawet jeśli jedną instancję można zainicjować za pomocą dwóch określonych plików konfiguracyjnych, wszystkie dzienniki mają ten sam kanał i są przetwarzane w ten sam sposób ...

Czy powinienem uruchamiać tyle instancji, ile mam różnych typów dzienników?

David
źródło
2
Powinieneś zaakceptować poprawną odpowiedź Bena Lima!
Ben Wheeler,

Odpowiedzi:

191

Czy powinienem uruchamiać tyle instancji, ile mam różnych typów dzienników?

Nie! Możesz uruchomić tylko jedną instancję do obsługi różnych typów dzienników.

W pliku konfiguracyjnym logstash możesz określić każde wejście innym typem . Następnie w filtrze możesz użyć if, aby odróżnić różne przetwarzanie, a także na wyjściu możesz użyć wyjścia "if" do innego miejsca docelowego.

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

Mam nadzieję, że to ci pomoże :)

Ben Lim
źródło
1
Możesz również użyć typeatrybutu (z tą samą type => "value"składnią) w definicjach filtru i danych wyjściowych, co powinno nieco zmniejszyć dodatkowe formatowanie w pliku konfiguracyjnym. Przykład: gist.github.com/fairchild/3030472 Zgodnie z dokumentacją: Dodaj pole „typ” do wszystkich zdarzeń obsługiwanych przez to wejście. Typy są używane głównie do aktywacji filtrów. Typ jest przechowywany jako część samego zdarzenia, więc możesz również użyć typu, aby wyszukać go w interfejsie internetowym.
Tony Cesaro,
5
Cóż, wygląda na to, że to, co dostarczył Ben, jest w rzeczywistości nowym sposobem na zrobienie tego. Kiedy użyłem type => "value"w danych wyjściowych, pojawił się następujący komunikat: „Używasz przestarzałego ustawienia konfiguracji„ typ ”ustawionego w stdout. Przestarzałe ustawienia będą nadal działać, ale są zaplanowane do usunięcia z logstash w przyszłości. Możesz to osiągnąć to samo zachowanie z nowymi warunkami, takimi jak:. if [type] == "sometype" { stdout { ... } }" Cofam swój poprzedni komentarz. :)
Tony Cesaro
Zwróć uwagę, że typeatrybut nie będzie miał zastosowania, jeśli w danych wejściowych istnieje już pole typu. Jest to specjalny atrybut, który nie zastępuje i jest udokumentowany. Otworzyłem bilet w Elastic i zalecili mi użycie tagslub add_fieldzamiasttype
BornToCode
@BornToCode, nie całkiem rozumiem. Chcesz powiedzieć, że coś jest nie tak z kodem Bena? Albo że nie zadziała, jeśli ścieżki dziennika były tym samym plikiem? Jaki jest scenariusz, w którym to nie działa?
Ben Wheeler,
2
@BenLim OP nie zaakceptował Twojej odpowiedzi, ale uznałem ją za najbardziej pomocną i pozytywnie Cię zagłosował.
bigbadmouse
15

Użyłem tagów do wprowadzania wielu plików:

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
źródło
Jest to lepsze niż akceptowana odpowiedź: pozwala na wiele danych wejściowych filebeat w logstash. W takich przypadkach właściwość „type” jest ustawiona na „log” i nie można jej modyfikować.
Régis B.
Ale czy to nie jest nadpisywanie tagów ostatnim tagiem (bbb)? Z drugiej strony, w if statememt, gdyby tagi były tablicą lub pojedynczym ciągiem znaków, wtedy oba IF działałyby. Więc logicznie jest to niepoprawne, ale może logstash ma inną logikę wewnątrz if
meso_2600
0

Myślę, że logstash nie może odczytać więcej niż 2 plików w sekcji Input. spróbuj poniżej

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
źródło
Tak,
napotkam ten