• Logstash的简单介绍


    logstash的简介

    1. logstash的概念:是一款开源的数据收集引擎,具有实时管道处理能力。
    2. logstash具有200多个插件,可以接受各种各样的数据(如日志、网络请求、关系型数据库、传感器或物联网等等)
    3. Logstash工作过程:
      1. Logstash 就像管道符一样,读取输入数据,然后处理过滤数据,最后输出到目的地(数据在线程之间以事件的形式流传)
      2. logstash数据处理过程包括三个部分:input、filter、output
      3. input和output部分可以使用codecs对数据格式进行处理
      4. Input,Filter,Output和codec:都是以插件形式存在
      5. 用户可以通过设置pipeline配置文件,设置符合需求的input、filter、outer、codecs插件实现对指定数据的采集、处理和输出功能
    4. logstash的三大部分的介绍:
      1. input:从数据源获取数据。不同的数据源使用不同的插件。常用的插件有:file、jdbc、Redis、syslog、beats 、http等
      2. filter:用于处理数据。对从数据源获取到的数据按照需求进行处理(如:解析数据、删除字段、类型转换等)。常用的组件有:date、grok、dessect、mutate、json、geoip、ruby等
      3. output:用于将数据输出到目的地。不同的目的地使用不同的插件。常用的插件有:elaticsearch、file、graphite、statsd等
      4. codec:用于对数据进行编码解码。不是一个单独的流程,是用于input和output部分对数据进行编解码作用。常见的组件有:json、multiline等
      5. logstash不是一个input-filter-output的数据流,而是一个 input | decode | filter | encode | output 的数据流。
    5. logstash将数据转换为事件时候,会给事件添加一些额外的信息。下面介绍几个常见的额为信息:
      1. @timestamp:用来标记事件的发生时间
      2. host:标记事件发生地址
      3. type:标记事件的唯一类型(input和output部分都可以配置多个不同的插件,每个插件可以用type来唯一标记这个插件,可以实现对不同的插件进行不同的处理)
      4. tags:标记事件的某方面属性。这是一个数组,一个事件可以有多个标签
    6. Logstash中的数据类型:
      1. bool:use_column_value => true
      2. string:jdbc_driver_class => "com.mysql.jdbc.Driver"
      3. number:jdbc_page_size => 50000
      4. array:hosts => ["192.168.57.100:9200","192.168.57.101:9200","192.168.57.102:9200"]
      5. hash:options =>{key1 =>value1,key2 =>value2}
    7. logastah中的逻辑运算符:
      1. 相等关系:==、!=、<、>、<=、>=
      2. 正则关系:=~(匹配正则)、!~(不匹配正则)
      3. 包含关系:in、not in
      4. 布尔操作:and(与)、or(或)、nand(非与)、xor(非或)
      5. 一元运算符:!(取反)、()(复合表达式)、!() (对复合表达式结果取反)

    三大模块插件的简单介绍

    input

    1. 标准输入插件:表示从控制台输入
      input {stdin { }}
    2. file插件:表示从文件读取数据(如日志文件)
      input {
          file {
              # 要导入的文件的位置,
              path => "/var/lib/mysql/slow.log"            
              # 从文件开始的位置开始读,end表示从结尾开始读
              start_position => "beginning"
              # 多久之内没修改过的文件不读取,0为无限制,单位为秒
              ignore_older => 0  
              # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
              sincedb_path => "/dev/null"
              # type字段,可表明导入的日志类型
              type => "mysql-slow"
          }
      }

    filter

    1. Filter模块是logstash功能强大的主要原因,可以对Logstash Event进行丰富的处理(比如解析数据、删除字段、类型转换等等)
    2. 常见的Filter插件如下:
      插件名称 说明
      date 日期解析
      grok 正则匹配解析
      dessect 分隔符解析
      mutate 对字段做处理,比如删除、重命名、替换
      json 按照Json格式解析字段内容到指定字段中
      geoip 将ip地址进行解析获取地域信息(包括国别,省市,经纬度等)
      ruby 利用ruby代码来动态修改logstash event
    3. Date插件:可以将日期字符串解析为日期类型,然后替换@timestamp字段或者指定成其他字段(如果不指定为@timestamp字段,会使用系统的时间作为@timestamp的值)
      1. 将input中的event_date字段的字符串解析日期格式,将解析后的的数据作为@timestamp的值;event_date的日期字符串格式需要和后面的yyyy-MM-dd HH:mm:ss对应
      2. 如:2020/12/31 12:23:32  对应的格式为match =>["event_date","yyyy/MM/dd HH:mm:ss"]
        #将event_date字符串解析为日期类型,并将解析后的值作为@timestamp的值
        filter { date{ match
        =>["event_date","yyyy-MM-dd HH:mm:ss"] target =>"@timestamp" } }
    4. Grok插件:基于正则解析数据
      1. grok是filter最重要的插件,grok使用正则表达式来生成grok语法,将input的数据解析成需要的数据格式
      2. grok中常用patterns的路径:logstash_filevendorundlejrubyx.xgemslogstash-patterns-core-x.x.xpatternsgrok-patterns
      3. grok语法:%{SYNTAX:SEMANTIC}
        1. SYNTAX:grok pattern的名称
        2. SEMANTIC:赋值字段名称(将匹配到的值赋值给SEMANTIC这个字段)
        3. 如:%{NUMBER:field}:可以匹配数值类型,但是grok匹配出的内容都是字符串类型,可以通过在最后指定为int或者float来强转类型:%{NUMBER:field:int}
        4. 实例:控制台输入:hello 123456 666666
          filter{
              grok{
                  match => {
                      "message" => "hello %{NUMBER:num_file:int} %{NUMBER:number_file}"
                  }
              }
          }
      4. 自定义正则表达式:
        1. 例子:将匹配到的值赋值给num_file这个字段:(?<num_file>[0-9]{6})
        2. 控制台输入:hello 123456 666666
          filter{
              grok{
                  match => {
                      "message" => "hello (?<num_file>[0-9]{6}) %{NUMBER:number_file}"
                  }
              }
          }
      5. 自定义grok pattern:通过pattern_definitions参数,以键值对的方式定义pattern名称和内容(也可以通过pattern_dir参数,以文件的形式读取pattern)
        1. 例子:定义模板的名称为pattern_test,模板的内容是正则匹配8位的数字或者字母;并且使用了自定义的pattern
        2. 控制台输入:hello 1234abcd
          filter{
              grok{
                  match => {
                      "message" => "%{pattern_test:number_file}"
                  }
                  pattern_definitions => {
                      "pattern_test" => "hello [a-z0-9]{8}"
                  }
              }
          }
    5. Dissect插件:基于分隔符原理解析数据
      1. 解决grok解析时消耗过多cpu资源的问题
      2. 语法简单,能处理的场景比较有限
      3. 它只能处理格式相似,且有分隔符的字符串
      4. 语法如下:
        1. %{}里面是字段;字段名称可以自己定义
        2. 两个%{}之间是分隔符
      5. 例子:把日期和时间解析到同一个字段datetime_flie
        1. 控制台输入:Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool
          filter{
              dissect{
                  mapping => {
                      "message" => "%{datetime_flie} %{+datetime_flie} %{+datetime_flie} %{local_host} %{sys_file}[%{pid}]: %{message_flle}"
                  }
              }
          }
    6. Mutate插件:是使用最频繁的插件,可以对字段进行各种操作(比如重命名、删除、替换、更新等)
      1. convert:类型转换
      2. gsub字符串替换
      3. split、join、merge字符串切割、数组合并为字符串、数组合并为数组
      4. rename字段重命名
      5. update、replace字段内容更新或替换。它们都可以更新字段的内容,区别在于update只在字段存在时生效,而replace在字段不存在时会执行新增字段的操作
      6. remove_field删除字段
      7. 例子:对数据进行处理分割、添加字段和删除字段
        1. 控制台输入:hello Weiking 20200810 man
          filter{
              mutate{
                  split => ["message", " "]
                  add_field => {
                      "field_name" => "%{[message][0]}"
                      "name" => "%{[message][1]}"
                      "date" => "%{[message][2]}"
                      "sex" => "%{[message][3]}"
                  }
                  remove_field => "sex"
              }
          }
    7. Json插件:将指定字段的json格式的字符串进行解析,如果不指定target,会把解析出来的json数据直接放到根级别,可以通过target将解析后的json数据放到指定的字段中
      1. 例子:将json格式的字符串解析放在trans_all字段中
      2. 控制台输入:{"trans_jnls_no":"0","card_no":"623061571015020279","terminal_no":"zhanglq","atm_trans_types_type":"","customer_no":"106913609","cash_mark":"212"}
        filter{
            json{
                source => "message"
                target => "trans_all"
                remove_field => "message"
            }
        }
    8. Geoip插件:基于Geoip库解析IP数据获取地域信息
      1. GeoIP库:可以根据IP地址提供对应的地域信息(包括国别,省市,经纬度等)
      2. 例子:解析IP地址获取地域信息
        1. 控制台输入:124.160.75.205
          filter{
              geoip{
                  source => "message"
                  remove_field => "message"
              }
          }    

    output

    1. 标准输出插件:多用于调试,从控制台输出
      output {
          stdout {
              codec => rubydebug
          }
      } 
    2. elasticsearch插件:将数据输入到elaticsearch中
      output {
          elasticsearch {
              #es的ip和端口
              hosts => ["http://192.168.57.100:9200"] 
              #集群:hosts => ["10.0.xx.xx:9200", "10.0.xx.xx:9200", "10.0.xx.xx:9200"]        
              #ES索引名称(自己定义的)
              index => "mdl_001_202008"
              #文档类型
              document_type => "MdL_001"
              #设置数据的id为数据库中的字段
              document_id => "%{risk_event_no}-%{rule_id}"
          }
      }

    logstash配置实例

    1. logstash的配置的文件:input和output都可以配置多个不同的插件,filter可以针对input里面的每个数据源做不一样的过滤,通过各自定义的type来匹配
    2. 配置实例:
      input{
          #从控制台输入数据
          stdin{ 
              type => "stdin"
          }  
          #读取文件中的数据
          file {
              # 要导入的文件的位置,
              path => "/opt/data/data.json"            
              # 从文件开始的位置开始读,end表示从结尾开始读
              start_position => "beginning"
              # 多久之内没修改过的文件不读取,0为无限制,单位为秒
              ignore_older => 0  
              # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
              sincedb_path => "/dev/null"
              # type字段,可表明导入的日志类型
              type => "file"
          }
      }
      filter{
              if[type] == "stdin"{
                  mutate{
                      rename => ["message","timestamp"]
                  }
              }
              if[type] == "file"{
                  json{
                      source => "message"
                  }
              }
      }
      output {
              if[type] == "file"{
                elasticsearch {
                      #es的ip和端口
                      hosts => ["http://192.168.57.100:9200"] 
                      #集群:hosts => ["10.0.xx.xx:9200", "10.0.xx.xx:9200", "10.0.xx.xx:9200"]        
                      #ES索引名称(自己定义的)
                      index => "mdl_001_20200812"
                      #文档类型
                      document_type => "MdL_012"
                      #设置数据的id为数据库中的字段
                      document_id => "%{risk_event_no}"
                  }
      
              }
              if[type] == "stdin"{
                  stdout{
                      codec => rubydebug
                  }
              }
      } 
  • 相关阅读:
    文学、哲学段子
    文学、哲学段子
    js技术要点---JS 获取网页源代码
    泛型类,泛型方法,泛型委托的定义方法
    数组元素的逆序数
    stm32 ARM中的RO、RW和ZI DATA
    poj 3040 Allowance 贪心
    schedule()函数的调用时机(周期性调度)
    以JTextPanel为例Swing的鼠标事件详解
    实习生面试总结
  • 原文地址:https://www.cnblogs.com/WeiKing/p/13448973.html
Copyright © 2020-2023  润新知