Sintaxe de configuração do Logstash

O pipeline logstash contém dois elementos necessários: entrada e saída, e um elemento opcional: filtro.

 Leia a origem do evento da entrada (após a análise e processamento do filtro) e a saída da saída para o repositório de destino (elasticsearch ou outro).

  Para usar o logstash no ambiente de produção, geralmente use a configuração para gravar o arquivo e, em seguida, inicie o logstash.

Para obter detalhes, consulte o site oficial: https://www.elastic.co/guide/en/logstash/7.1/index.html

  Processar registros do nginx

# vim nginx_access.conf
input{
    file{
        path => "/var/log/nginx/access.log"
        start_position => "beginning"
        type => "nginx_access_log"
    }
}
filter{
    grok{
        match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"(?:-|%{DATA:referrer})\" \"%{DATA:user_agent}\" (?:%{IP:proxy}|-) %{DATA:upstream_addr} %{NUMBER:upstream_request_time:float} %{NUMBER:upstream_response_time:float}"}
        match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"%{DATA:referrer}\" \"%{DATA:user_agent}\" \"%{DATA:proxy}\""}
    }
    if [request] {
        urldecode {
            field => "request"
        }
       ruby {
           init => "@kname = ['url_path','url_arg']"
           code => "
               new_event = LogStash::Event.new(Hash[@kname.zip(event.get('request').split('?'))])
               event.append(new_event)"
       }
        if [url_arg] {
            ruby {
               init => "@kname = ['key', 'value']"
               code => "event.set('url_args', event.get('url_arg').split('&').collect {|i| Hash[@kname.zip(i.split('='))]})"
                }
        }
    }
    geoip{
        source => "clientip"
    }
    useragent{
        source => "user_agent"
        target => "ua"
        remove_field => "user_agent"
    }
    date {
        match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        locale => "en"
    }
    mutate{
        remove_field => ["message","timestamp","request","url_arg"]
    }
}
output{
    elasticsearch {      
        hosts => "localhost:9200"
        index => "nginx-access-log-%{+YYYY.MM.dd}"   
    }
#  stdout {       
#     codec => rubydebug    
#  }
}

 

 

Se você quiser testar se o arquivo de configuração está escrito corretamente, use o seguinte método para iniciar o teste

/usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/nginx.conf  #测试配置文件
Configuration OK
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_access.conf  #启动logstash

Iniciar logstash

# systemctl start logstash

 O plug-in de entrada   permite que o logstash leia fontes de eventos específicas.

 Site oficial: https://www.elastic.co/guide/en/logstash/current/input-plugins.html

 A fonte do evento pode ser lida a partir da entrada da tela stdin, do arquivo especificado por arquivo ou de es, filebeat, kafka, redis, etc.

  • entrada padrão stdin 
  • arquivo    ler dados do arquivo
    file{
        path => ['/var/log/nginx/access.log']  #要输入的文件路径
        type => 'nginx_access_log'
        start_position => "beginning"
    }
    # path  可以用/var/log/*.log,/var/log/**/*.log,如果是/var/log则是/var/log/*.log
    # type 通用选项. 用于激活过滤器
    # start_position 选择logstash开始读取文件的位置,begining或者end。
    还有一些常用的例如:discover_interval,exclude,sincedb_path,sincedb_write_interval等可以参考官网
     
  • syslog   lê mensagens de log do sistema como eventos na rede

     

    syslog{
        port =>"514" 
        type => "syslog"
    }
    # port 指定监听端口(同时建立TCP/UDP的514端口的监听)
    
    #从syslogs读取需要实现配置rsyslog:
    # cat /etc/rsyslog.conf   加入一行
    *.* @172.17.128.200:514   #指定日志输入到这个端口,然后logstash监听这个端口,如果有新日志输入则读取
    # service rsyslog restart   #重启日志服务

     

  • as batidas    recebem eventos das batidas elásticas

     

    beats {
        port => 5044   #要监听的端口
    }
    # 还有host等选项
    
    # 从beat读取需要先配置beat端,从beat输出到logstash。
    # vim /etc/filebeat/filebeat.yml 
    ..........
    output.logstash:
    hosts: ["localhost:5044"]

     

  • Kafka   lê os dados no tópico Kafka como eventos

     

    kafka{
        bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
        topics => ["access_log"]
        group_id => "logstash-file"
        codec => "json"
    }
    kafka{
        bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
        topics => ["weixin_log","user_log"]  
        codec => "json"
    }
    # bootstrap_servers 用于建立群集初始连接的Kafka实例的URL列表。
    # topics  要订阅的主题列表,kafka topics
    # group_id 消费者所属组的标识符,默认为logstash。kafka中一个主题的消息将通过相同的方式分发到Logstash的group_id
    # codec 通用选项,用于输入数据的编解码器。

     

   Existem muitos tipos de plug-ins de entrada, você pode consultar a documentação oficial para configurar.

plugin de filtro plugin de filtro, execute o processamento intermediário no evento

  • grok    analisa o texto e o constrói. Analise os dados de registro não estruturados em dados estruturados e consultáveis ​​por meio de análises regulares 

     

    grok {
                match => {"message"=>"^%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}$"}
            }
    匹配nginx日志
    # 203.202.254.16 - - [22/Jun/2018:16:12:54 +0800] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"
    #220.181.18.96 - - [13/Jun/2015:21:14:28 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

     

  •  Observe que grok pode ter várias regras de correspondência. Se a correspondência anterior falhar, você pode usar o seguinte para continuar a correspondência. Por exemplo
     grok {
                match => ["message", "%{IP:clientip} - %{USER:user} \[%{HTTPDATE:raw_datetime}\] \"(?:%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion})\" (?:\"%{DATA:body}\" )?(?:\"%{DATA:cookie}\" )?%{NUMBER:response} (?:%{NUMBER:bytes:int}|-) \"%{DATA:referrer}\" \"%{DATA:agent}\" (?:(%{IP:proxy},? ?)*|-|unknown) (?:%{DATA:upstream_addr} |)%{NUMBER:request_time:float} (?:%{NUMBER:upstream_time:float}|-)"]
                match => ["message", "%{IP:clientip} - %{USER:user} \[%{HTTPDATE:raw_datetime}\] \"(?:%{WORD:verb} %{URI:request} HTTP/%{NUMBER:httpversion})\" (?:\"%{DATA:body}\" )?(?:\"%{DATA:cookie}\" )?%{NUMBER:response} (?:%{NUMBER:bytes:int}|-) \"%{DATA:referrer}\" \"%{DATA:agent}\" (?:(%{IP:proxy},? ?)*|-|unknown) (?:%{DATA:upstream_addr} |)%{NUMBER:request_time:float} (?:%{NUMBER:upstream_time:float}|-)"]       
            }

    sintaxe grok:% {SYNTAX: SEMANTIC} significa% {regular: nome do campo personalizado}

                     O oficial fornece muitos padrões regulares de grok que podem ser usados ​​diretamente: https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns  

                     ferramenta de depuração grok: http://grokdebug.herokuapp.com

      Ferramenta de depuração de expressão regular: https://www.debuggex.com/

    Precisa usar um conhecimento mais regular, os documentos de referência são: https://www.jb51.net/tools/zhengze.html

         Padrão personalizado: (? <Nome do campo> o padrão)

        Por exemplo: match 2018/06/27 14:00:54  

                (? <datetime> \ d \ d \ d \ d \ / \ d \ d \ / \ d \ d \ d \ d: \ d \ d: \ d \ d)

          Obtenha o resultado: "datetime": "2018/06/27 14:00:54"

 

  • date Data parsing Analisa a data no campo e, a seguir, despeja em @timestamp

    Copiar código

    
    [2018-07-04 17:43:35,503]
    grok{
          match => {"message"=>"%{DATA:raw_datetime}"}
    }
    date{
           match => ["raw_datetime","YYYY-MM-dd HH:mm:ss,SSS"]
            remove_field =>["raw_datetime"]
    }
    
    #将raw_datetime存到@timestamp 然后删除raw_datetime
    
    #24/Jul/2018:18:15:05 +0800
    date {
          match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z]
    }
    

     

  • Mutate processa os campos, renomeia, exclui, substitui e modifica os campos.
    • Conversão de tipo secreto  . Os tipos incluem: integer, float, integer_eu, float_eu, string e boolean

       

      filter{
          mutate{
      #     covert => ["response","integer","bytes","float"]  #数组的类型转换
              convert => {"message"=>"integer"}
          }
      }
      #测试------->
      {
                "host" => "localhost",
             "message" => 123,    #没带“”,int类型
          "@timestamp" => 2018-06-26T02:51:08.651Z,
            "@version" => "1"
      }
       

       

    • a divisão    usa um delimitador para dividir a string em uma matriz

       

      mutate{
          split => {"message"=>","}
      }
      #---------->
      aaa,bbb
      {
          "@timestamp" => 2018-06-26T02:40:19.678Z,
            "@version" => "1",
                "host" => "localhost",
             "message" => [
              [0] "aaa",
              [1] "bbb"
          ]}
      192,128,1,100
      {
              "host" => "localhost",
           "message" => [
            [0] "192",
            [1] "128",
            [2] "1",
            [3] "100"
       ],
        "@timestamp" => 2018-06-26T02:45:17.877Z,
          "@version" => "1"
      }

       

    • mesclar   campos de mesclagem. Array e string, string e string

       

      filter{
          mutate{
              add_field => {"field1"=>"value1"}
          }
          mutate{ 
                split => {"message"=>"."}   #把message字段按照.分割
          }
          mutate{
              merge => {"message"=>"field1"}   #将filed1字段加入到message字段
          }
      }
      #--------------->
      abc
      {
             "message" => [
              [0] "abc,"
              [1] "value1"
          ],
          "@timestamp" => 2018-06-26T03:38:57.114Z,
              "field1" => "value1",
            "@version" => "1",
                "host" => "localhost"
      }
      
      abc,.123
      {
             "message" => [
              [0] "abc,",
              [1] "123",
              [2] "value1"
          ],
          "@timestamp" => 2018-06-26T03:38:57.114Z,
              "field1" => "value1",
            "@version" => "1",
                "host" => "localhost"
      }

       

    • renomear    renomeia o campo

       

      filter{
          mutate{
              rename => {"message"=>"info"}
          }
      }
      #-------->
      123
      {
          "@timestamp" => 2018-06-26T02:56:00.189Z,
                "info" => "123",
            "@version" => "1",
                "host" => "localhost"
      }

       

    • remove_field     remove campo
      mutate {
          remove_field => ["message","datetime"]
      }

       

    • join   conecta a matriz com um delimitador, se não for uma matriz, nenhum processamento

       

      mutate{
              split => {"message"=>":"}
      }
      mutate{
              join => {"message"=>","}
      }
      ------>
      abc:123
      {
          "@timestamp" => 2018-06-26T03:55:41.426Z,
             "message" => "abc,123",
                "host" => "localhost",
            "@version" => "1"
      }
      aa:cc
      {
          "@timestamp" => 2018-06-26T03:55:47.501Z,
             "message" => "aa,cc",
                "host" => "localhost",
            "@version" => "1"
      }

       

    • gsub   substitui valores de campo por regular ou string. Válido apenas para strings 

       

      mutate{
              gsub => ["message","/","_"]   #用_替换/
          }
      
      ------>
      a/b/c/
      {
            "@version" => "1",
             "message" => "a_b_c_",
                "host" => "localhost",
          "@timestamp" => 2018-06-26T06:20:10.811Z
      }

       

    • update   atualiza os campos. Se o campo não existir, não faça nada

       

      mutate{
              add_field => {"field1"=>"value1"}
          }
          mutate{
              update => {"field1"=>"v1"}
              update => {"field2"=>"v2"}    #field2不存在 不做处理
          }
      ---------------->
      {
          "@timestamp" => 2018-06-26T06:26:28.870Z,
              "field1" => "v1",
                "host" => "localhost",
            "@version" => "1",
             "message" => "a"
      }
       

       

    • substituir  atualiza o campo. Se o campo não existir, crie

       

       mutate{
              add_field => {"field1"=>"value1"}
          }
          mutate{
              replace => {"field1"=>"v1"}
              replace => {"field2"=>"v2"}
          }
      ---------------------->
      {
             "message" => "1",
                "host" => "localhost",
          "@timestamp" => 2018-06-26T06:28:09.915Z,
              "field2" => "v2",        #field2不存在,则新建
            "@version" => "1",
              "field1" => "v1"
      }

       

  • geoip   adiciona informações sobre a localização geográfica do endereço IP com base nos dados do banco de dados Maxmind GeoLite2
     geoip {
                source => "clientip"
                database =>"/tmp/GeoLiteCity.dat"
            }

     

  • O plugin ruby     ruby pode executar código Ruby arbitrário

     

    filter{
        urldecode{
            field => "message"
        }
        ruby {
            init => "@kname = ['url_path','url_arg']"
            code => " 
                new_event = LogStash::Event.new(Hash[@kname.zip(event.get('message').split('?'))]) 
                event.append(new_event)"
        }
        if [url_arg]{
            kv{
                source => "url_arg"
                field_split => "&"
                target => "url_args"
                remove_field => ["url_arg","message"]
            }
        }
    }
    # ruby插件
    # 以?为分隔符,将request字段分成url_path和url_arg
    -------------------->
    www.test.com?test
    {
           "url_arg" => "test",
              "host" => "localhost",
          "url_path" => "www.test.com",
           "message" => "www.test.com?test",  
          "@version" => "1",
        "@timestamp" =>  2018-06-26T07:31:04.887Z
    }
    www.test.com?title=elk&content=学习elk
    {
          "url_args" => {
              "title" => "elk",
            "content" => "学习elk"
        },
              "host" => "localhost",
          "url_path" => "www.test.com",
          "@version" => "1",
        "@timestamp" =>  2018-06-26T07:33:54.507Z
    }

     

  • urldecode é     usado para decodificar os campos codificados, o que pode resolver o problema de erros do chinês na URL

     

     urldecode{
            field => "message"
        }
    
    # field :指定urldecode过滤器要转码的字段,默认值是"message"
    # charset(缺省): 指定过滤器使用的编码.默认UTF-8

     

  • kv    divide a string em chave / valor especificando o separador

     

    kv{
            prefix => "url_"   #给分割后的key加前缀
            target => "url_ags"    #将分割后的key-value放入指定字段
            source => "message"   #要分割的字段
            field_split => "&"    #指定分隔符
            remove_field => "message"
        }
    -------------------------->
    a=1&b=2&c=3
    {
                "host" => "localhost",
           "url_ags" => {
              "url_c" => "3",
              "url_a" => "1",
              "url_b" => "2"
        },
          "@version" => "1",
        "@timestamp" => 2018-06-26T07:07:24.557Z
     

    Copiar código

  • useragent  adiciona informações sobre o agente do usuário (como série, sistema operacional, versão e dispositivo)

    Copiar código

    if [agent] != "-" {
      useragent {
        source => "agent"
        target => "ua"
        remove_field => "agent"
      }
    }
    # if语句,只有在agent字段不为空时才会使用该插件
    #source 为必填设置,目标字段
    #target 将useragent信息配置到ua字段中。如果不指定将存储在根目录中
    
     

     

operador de comparação logstash

  Igual a: ==,! =, <,>, <=,> =
  Regular: = ~,! ~ (Verifica um padrão à direita em relação a um valor de string à esquerda)
  Relação de contenção: dentro, não em

  Operadores booleanos com suporte: and, or, nand, xor

  Operadores unários suportados :!

plugin de saída plugin de saída, envia eventos para um destino específico.

  • saída padrão stdout. Eventos de saída para a tela
    resultado{
        stdout {
            codec => "rubydebug"
        }
    }
  • arquivo gravar evento em arquivo
        Arquivo {
           path => "/ data / logstash /% {host} / {aplicativo}
           codec => linha {format => "% {mensagem}"}}
        }
  • Kafka envia eventos para kafka
        kafka {
            bootstrap_servers => "localhost: 9092"
            topic_id => "test_topic" # Configurações necessárias. O assunto da mensagem gerada
        }
  • elasticseach armazena logs em es
        elasticsearch {
            hosts => "localhost: 9200"
            index => "nginx-access-log -% {+ YYYY.MM.dd}"  
        }
    #index O índice onde o evento é gravado. Você pode criar um índice de acordo com o log, para que possa excluir dados antigos e pesquisar o log por tempo

 Adicionar um plugin codec plugin codec

  O codec é essencialmente um filtro de fluxo e pode ser executado como parte de um plug-in de entrada ou saída. Por exemplo, é útil no plug-in stdout da saída acima.

  • plug-in de codec multilinha Mesclagem de várias linhas, processamento de logs de pilha ou outros logs com caracteres de nova linha precisam ser usados

     

    input {
      stdin {
        codec => multiline {
          pattern => "pattern, a regexp"    #正则匹配规则,匹配到的内容按照下面两个参数处理
          negate => "true" or "false"     # 默认为false。处理匹配符合正则规则的行。如果为true,处理不匹配符合正则规则的行。
          what => "previous" or "next"    #指定上下文。将指定的行是合并到上一行或者下一行。
        }
      }
    }
    codec => multiline {
        pattern => "^\s"  
        what => "previous"  
    }
    # 以空格开头的行都合并到上一行
    
    codec => multiline {
        # Grok pattern names are valid! :)
        pattern => "^%{TIMESTAMP_ISO8601} "
        negate => true
        what => "previous"
    }
    # 任何不以这个时间戳格式开头的行都与上一行合并
    
    codec => multiline {
       pattern => "\\$"
       what => "next"
    }
    # 以反斜杠结尾的行都与下一行合并

     

Acho que você gosta

Origin blog.csdn.net/Baron_ND/article/details/109357350
Recomendado
Clasificación