Logstash【从无到有从有到无】【L11】转化数据(Transforming Data)

目录

1.转化数据(Transforming Data)

1.1.执行核心操作(Performing Core Operations)

日期过滤器(date filter)

删除过滤器(drop filter)

指纹过滤器(fingerprint filter)

变异过滤器(mutate filter)

Ruby过滤器(ruby filter)

1.2.反序列化数据(Deserializing Data)

Avro编解码器(avro codec)

CSV过滤器(csv filter)

流利的编解码器(fluent codec)

json编解码器(json codec)

Protobuf编解码器(protobuf codec)

xml过滤器

1.3.提取字段和整理数据(Extracting Fields and Wrangling Data)

解剖滤镜(dissect filter)

KV滤波器(kv filter)

grok filter

1.4.通过查找丰富数据(Enriching Data with Lookups)

1.4.1.查找插件

DNS过滤器(dns filter)

弹性搜索过滤器(elasticsearch filter)

地质过滤器(geoip filter)

http过滤器(http filter)

jdbc_static过滤器(jdbc_static filter)

jdbc_streaming过滤器(jdbc_streaming filter)

记忆快取筛选器(memcached filter)

翻译过滤器(translate filter)

用户代理过滤器(useragent filter)


1.转化数据(Transforming Data)

在Logstash插件生态系统中有200多个插件,选择最好的插件来满足您的数据处理需求有时很有挑战性。在本节中,我们收集了一个流行插件列表,并根据它们的处理能力进行组织:

  • 执行核心操作(Performing Core Operations)
  • 反序列化数据(Deserializing Data)
  • 提取字段和争吵数据(Deserializing Data)
  • 使用查找丰富数据(Enriching Data with Lookups)

另请参阅Filter插件Codec插件以获取可用数据处理插件的完整列表。

 

1.1.执行核心操作(Performing Core Operations)

本节中描述的插件对于核心操作非常有用,比如改变和删除事件。

日期过滤器date filter

解析字段中的日期以用作事件的Logstash时间戳。

以下配置解析名为 logdate 字段用来设置Logstash时间戳:

filter {
  date {
    match => [ "logdate", "MMM dd yyyy HH:mm:ss" ]
  }
}

删除过滤器drop filter

删除事件。该过滤器通常与条件语句结合使用。

以下配置删除debug级别日志消息:

filter {
  if [loglevel] == "debug" {
    drop { }
  }
}

指纹过滤器fingerprint filter

通过应用一致的哈希来指纹字段。

以下配置对IP@timestampmessage字段进行指纹识别,并将哈希添加到名为generated_id的元数据字段中:

filter {
  fingerprint {
    source => ["IP", "@timestamp", "message"]
    method => "SHA1"
    key => "0123"
    target => "[@metadata][generated_id]"
  }
}

变异过滤器mutate filter

在字段上执行一般改变。您可以重命名(rename),删除(remove),替换(replace)和修改(modify)事件中的字段。

以下配置将HOSTORIP字段重命名为client_ip

filter {
  mutate {
    rename => { "HOSTORIP" => "client_ip" }
  }
}

以下配置从指定字段中去除首尾的空格:

filter {
  mutate {
    strip => ["field1", "field2"]
  }
}

Ruby过滤器ruby filter

执行Ruby代码。

以下配置执行可取消90%事件的Ruby代码:

filter {
  ruby {
    code => "event.cancel if rand <= 0.90"
  }
}

 

1.2.反序列化数据(Deserializing Data)

本节中描述的插件对于将数据反序列化对于Logstash事件很有用。

Avro编解码器avro codec

将序列化的Avro记录读取为Logstash事件。该插件反序列化单个Avro记录。它不用于读取Avro文件。Avro文件具有唯一的格式,必须在输入时进行处理。

以下配置反序列化来自Kafka的输入:

input {
  kafka {
    codec => {
      avro => {
        schema_uri => "/tmp/schema.avsc"
      }
    }
  }
}
...

CSV过滤器csv filter

将逗号分隔的值数据解析为单个字段。默认情况下,过滤器会自动生成字段名称(column1,column2等),或者您可以指定名称列表。您也可以更改列分隔符。

以下配置将CSV数据解析为在字段中指定的columns字段名称 :

filter {
  csv {
    separator => ","
    columns => [ "Transaction Number", "Date", "Description", "Amount Debit", "Amount Credit", "Balance" ]
  }
}

流利的编解码器fluent codec

读取Fluentd msgpack模式。

以下配置对从fluent-logger-ruby接收到的日志进行解码:

input {
  tcp {
    codec => fluent
    port => 4000
  }
}

json编解码器json codec

解码(通过输入)和编码(通过输出)JSON格式的内容,从而在JSON数组中为每个元素创建一个事件。

以下配置可解码文件中的JSON格式的内容:

input {
  file {
    path => "/path/to/myfile.json"
    codec =>"json"
}

Protobuf编解码器protobuf codec

读取protobuf编码的消息,并将其转换为Logstash事件。需要将protobuf定义编译为Ruby文件。您可以使用 ruby-protoc编译器进行编译

以下配置可解码来自Kafka流的事件:

input
  kafka {
    zk_connect => "127.0.0.1"
    topic_id => "your_topic_goes_here"
    codec => protobuf {
      class_name => "Animal::Unicorn"
      include_path => ['/path/to/protobuf/definitions/UnicornProtobuf.pb.rb']
    }
  }
}

xml过滤器

将XML解析为字段。

以下配置解析存储在message字段中的整个XML文档:

filter {
  xml {
    source => "message"
  }
}

 

1.3.提取字段和整理数据(Extracting Fields and Wrangling Data)

本节中描述的插件对于提取字段并将非结构化数据解析为字段很有用。

解剖滤镜dissect filter

使用定界符将非结构化事件数据提取到字段中。解剖过滤器不使用正则表达式,并且非常快。但是,如果数据的结构因行而异,则 grok filter更为合适。

例如,假设您有一个包含以下消息的日志:

Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...

以下配置剖析了消息:

filter {
  dissect {
    mapping => { "message" => "%{ts} %{+ts} %{+ts} %{src} %{prog}[%{pid}]: %{msg}" }
  }
}

应用解剖过滤器后,事件将被分解为以下字段:

{
  "msg"        => "Starting system activity accounting tool...",
  "@timestamp" => 2017-04-26T19:33:39.257Z,
  "src"        => "localhost",
  "@version"   => "1",
  "host"       => "localhost.localdomain",
  "pid"        => "1",
  "message"    => "Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...",
  "type"       => "stdin",
  "prog"       => "systemd",
  "ts"         => "Apr 26 12:20:02"
}

KV滤波器kv filter

解析键值对。

例如,假设您有一条包含以下键-值对的日志消息:

ip=1.2.3.4 error=REFUSED

以下配置将键值对解析为字段:

filter {
  kv { }
}

应用过滤器后,示例中的事件将具有以下字段:

  • ip: 1.2.3.4
  • error: REFUSED

grok filter

将非结构化事件数据解析为字段。该工具非常适合syslog日志,Apache和其他Web服务器日志,MySQL日志,以及通常用于人类而非计算机使用的任何日志格式。Grok通过将文本模式组合成与您的日志匹配的内容来工作。

例如,假设您有一个HTTP请求日志,其中包含以下消息:

55.3.244.1 GET /index.html 15824 0.043

以下配置将消息解析为字段:

filter {
  grok {
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}

应用过滤器后,示例中的事件将具有以下字段:

  • client: 55.3.244.1
  • method: GET
  • request: /index.html
  • bytes: 15824
  • duration: 0.043

如果您需要构建grok模式的帮助,请尝试 Grok Debugger。Grok调试器是基本许可证下的X-Pack功能,因此可以免费使用

 

1.4.通过查找丰富数据(Enriching Data with Lookups)

这些插件可以帮助您通过其他信息(例如GeoIP和用户代理信息)来丰富数据:

1.4.1.查找插件

DNS过滤器dns filter

执行标准或反向DNS查找

以下配置对source_host字段中的地址执行反向查找, 并将其替换为域名:

filter {
  dns {
    reverse => [ "source_host" ]
    action => "replace"
  }
}

 

弹性搜索过滤器elasticsearch filter

elasticsearch filter 从ElasticSearch以前的日志事件中复制字段到当前事件。

下面的配置显示了如何使用此筛选器的完整示例。

每当Logstash收到“end”事件时,它都会使用此Elasticsearch过滤器,基于某些操作标识符来找到匹配的“start”事件。然后,它将@timestamp字段从“start”事件复制到“end”事件的新字段中。最后,结合使用date filter和ruby filter,示例中的代码将计算两个事件之间的持续时间(以小时为单位)。

if [type] == "end" {
         elasticsearch {
            hosts => ["es-server"]
            query => "type:start AND operation:%{[opid]}"
            fields => { "@timestamp" => "started" }
         }
         date {
            match => ["[started]", "ISO8601"]
            target => "[started]"
         }
         ruby {
            code => 'event.set("duration_hrs", (event.get("@timestamp") - event.get("started")) / 3600) rescue nil'
        }
      }

 

地质过滤器geoip filter

此geoip过滤器添加有关IP地址位置的地理信息。 例如:

filter {
  geoip {
    source => "clientip"
  }
}

应用geoip过滤器后,将使用geoip字段丰富事件。 例如:

filter {
  geoip {
    source => "clientip"
  }
}


http过滤器http filter

http筛选器与外部Web服务/ REST API集成在一起,并且可以针对任何HTTP服务或终结点进行查询扩展。该插件非常适合许多扩展用例,例如社交API,情感API,安全Feed API和业务服务API。

 

jdbc_static过滤器jdbc_static filter

jdbc_static过滤器通过从远程数据库预加载的数据来丰富事件。

下面的例子从远程数据库获取数据,在本地数据库缓存它,并使用查找来充实与本地数据库缓存数据的事件。

filter {
  jdbc_static {
    loaders => [ 
      {
        id => "remote-servers"
        query => "select ip, descr from ref.local_ips order by ip"
        local_table => "servers"
      },
      {
        id => "remote-users"
        query => "select firstname, lastname, userid from ref.local_users order by userid"
        local_table => "users"
      }
    ]
    local_db_objects => [ 
      {
        name => "servers"
        index_columns => ["ip"]
        columns => [
          ["ip", "varchar(15)"],
          ["descr", "varchar(255)"]
        ]
      },
      {
        name => "users"
        index_columns => ["userid"]
        columns => [
          ["firstname", "varchar(255)"],
          ["lastname", "varchar(255)"],
          ["userid", "int"]
        ]
      }
    ]
    local_lookups => [ 
      {
        id => "local-servers"
        query => "select descr as description from servers WHERE ip = :ip"
        parameters => {ip => "[from_ip]"}
        target => "server"
      },
      {
        id => "local-users"
        query => "select firstname, lastname from users WHERE userid = :id"
        parameters => {id => "[loggedin_userid]"}
        target => "user" 
      }
    ]
    # using add_field here to add & rename values to the event root
    add_field => { server_name => "%{[server][0][description]}" }
    add_field => { user_firstname => "%{[user][0][firstname]}" } 
    add_field => { user_lastname => "%{[user][0][lastname]}" }
    remove_field => ["server", "user"]
    jdbc_user => "logstash"
    jdbc_password => "example"
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_driver_library => "/tmp/logstash/vendor/postgresql-42.1.4.jar"
    jdbc_connection_string => "jdbc:postgresql://remotedb:5432/ls_test_2"
  }
}
loaders 查询外部数据库获取将被本地缓存的数据集。
local_db_objects 定义用于构建本地数据库结构的列,类型和索引。 列名称和类型应与外部数据库匹配。
local_lookups 执行在本地数据库中查找查询,以丰富的事件活动。
local_lookups target => "user" 指定将存储查找数据的事件字段。 如果查找返回多列,则数据将作为JSON对象存储在字段中。
add_field => { user_firstname => "%{[user][0][firstname]}" }  从JSON对象获取数据并将其存储在顶级事件字段中,以便在Kibana中进行更轻松的分析。

 

jdbc_streaming过滤器jdbc_streaming filter

jdbc_streaming过滤器使用数据库数据丰富事件活动。

以下示例执行一个SQL查询并将结果集存储在一个名为country_details的字段中:

filter {
  jdbc_streaming {
    jdbc_driver_library => "/path/to/mysql-connector-java-5.1.34-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydatabase"
    jdbc_user => "me"
    jdbc_password => "secret"
    statement => "select * from WORLD.COUNTRY WHERE Code = :code"
    parameters => { "code" => "country_code"}
    target => "country_details"
  }
}

 

记忆快取筛选器memcached filter

memcached筛选器可针对Memcached对象缓存系统启用键/值查找富集。 它支持读取(GET)和写入(SET)操作。 对于安全分析用例,这是一个值得注意的补充。

 

翻译过滤器translate filter

转换过滤器根据哈希或文件中指定的替换值替换字段内容。 当前支持以下文件类型:YAML,JSON和CSV。

下面的示例采用response_code字段的值,基于字典中指定的值将其转换为描述,然后从事件中删除response_code字段:

filter {
  translate {
    field => "response_code"
    destination => "http_response"
    dictionary => {
      "200" => "OK"
      "403" => "Forbidden"
      "404" => "Not Found"
      "408" => "Request Timeout"
    }
    remove_field => "response_code"
  }
}

 

 

用户代理过滤器useragent filter

useragent过滤器将用户代理字符串解析为字段。

以下示例在agent字段中获取用户agent字符串,将其解析为user agent字段,然后将user agent字段添加到名为user_agent的新字段中。 它还会删除原始代理字段:

filter {
  useragent {
    source => "agent"
    target => "user_agent"
    remove_field => "agent"
  }
}

应用过滤器后,事件将使用用户代理字段进行充实。 例如:

"user_agent": {
          "os": "Mac OS X 10.12",
          "major": "50",
          "minor": "0",
          "os_minor": "12",
          "os_major": "10",
          "name": "Firefox",
          "os_name": "Mac OS X",
          "device": "Other"
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值