Como lidar com várias entradas heterogêneas com Logstash?

95

Digamos que você tenha 2 tipos muito diferentes de registros, como registros técnicos e comerciais, e deseja:

  • logs técnicos brutos sejam roteados para um servidor graylog2 usando uma gelfsaída,
  • Os logs de negócios json podem ser armazenados em um cluster elasticsearch usando a elasticsearch_httpsaída dedicada .

Eu sei que com, Syslog-NGpor exemplo, o arquivo de configuração permite definir várias entradas distintas que podem ser processadas separadamente antes de serem despachadas; o que Logstashparece incapaz de fazer. Mesmo que uma instância possa ser iniciada com dois arquivos de configuração específicos, todos os logs tomam o mesmo canal e estão sendo aplicados nos mesmos processamentos ...

Devo executar tantas instâncias quanto tiver diferentes tipos de logs?

David
fonte
2
Você deve aceitar a resposta correta de Ben Lim!
Ben Wheeler

Respostas:

191

Devo executar tantas instâncias quanto tiver diferentes tipos de logs?

Não! Você só pode executar uma instância para lidar com diferentes tipos de registros.

No arquivo de configuração logstash, você pode especificar cada entrada com um tipo diferente . Então, no filtro, você pode usar if para diferentes processamentos, e também na saída, você pode usar a saída "if" para destinos diferentes.

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

Espero que isso possa ajudá-lo :)

Ben Lim
fonte
1
Você também pode usar o typeatributo (com a mesma type => "value"sintaxe) nas definições de filtro e saída, o que deve reduzir um pouco a formatação extra dentro do arquivo de configuração. Exemplo: gist.github.com/fairchild/3030472 Por documentação: adicione um campo 'tipo' a todos os eventos tratados por esta entrada. Os tipos são usados ​​principalmente para ativação do filtro. O tipo é armazenado como parte do próprio evento, portanto, você também pode usar o tipo para pesquisá-lo na interface da web.
Tony Cesaro
5
Bem, parece que o que Ben forneceu é na verdade a nova maneira de fazer isso. Quando usei type => "value"em uma saída, recebi a seguinte mensagem exibida: "Você está usando uma definição de configuração obsoleta" tipo "definida em stdout. As configurações obsoletas continuarão a funcionar, mas estão programadas para remoção do logstash no futuro. Você pode conseguir este mesmo comportamento com as novas condicionais, como:. if [type] == "sometype" { stdout { ... } }" Retiro meu comentário anterior. :)
Tony Cesaro
Observe que o typeatributo não se aplicará se já houver um campo de tipo da entrada. Este é um atributo especial que não sobrescreve e é documentado. Abri um tíquete no Elastic e eles me recomendaram usar tagsou em add_fieldvez detype
BornToCode
@BornToCode, não entendo muito bem. Você está dizendo que há algo errado com o código de Ben? Ou que não funcionaria se os caminhos de log fossem o mesmo arquivo? Qual é o cenário em que não funciona?
Ben Wheeler
2
@BenLim O OP não aceitou sua resposta, mas achei muito útil e votei contra você.
bigbadmouse
15

Usei tags para entrada de vários arquivos:

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
fonte
Isso é melhor do que a resposta aceita: permite várias entradas de filebeat no logstash. Nesses casos, a propriedade "type" é definida como "log" e não pode ser modificada.
Régis B.
Mas isso não substitui as tags pela última tag (bbb)? E então, novamente, na instrução if, se as tags fossem uma matriz ou string única, então ambos os IFs funcionariam. Então, logicamente, isso está incorreto, mas talvez o logstash tenha uma lógica diferente dentro do if
meso_2600
0

Acho que o logstash não pode ler mais de 2 arquivos na seção de entrada. tente o abaixo

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
fonte
Sim,
encontrei o