Logstash笔记(三)——数据转换插件

ELK 专栏收录该内容
5 篇文章 0 订阅

1. 核心操作

如修改和删除事件。

1.1. date filter

解析字段中的日期,以用作事件的Logstash时间戳。
下面的配置解析一个名为logdate的字段来设置Logstash时间戳:

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

1.2. drop filter

删除事件。这个过滤器通常与条件句结合使用。
下面的配置将删除调试级别的日志消息:

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

1.3. fingerprint filter

通过应用一致性的散列来创建指纹字段。
下面的配置对IP、@timestamp和message字段进行指纹识别,并将散列添加到名为generated_id的元数据字段:

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

1.4. mutate filter

对字段执行一般的操作。您可以重命名、删除、替换和修改事件中的字段。
以下配置将HOSTORIP字段重命名为client_ip:

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

下面的配置将从指定的字段中删除前缀和后缀的空格:

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

1.5. ruby filter

执行 Ruby 代码.

下面的配置执行Ruby代码,用来取消90%的事件:

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

2. 数据反序列化

2.1. avro codec

将序列化的Avro记录读取为Logstash事件。这个插件反序列化单个Avro记录。它不是用来读取Avro文件的。Avro文件有一个独特的格式,必须在输入时处理。
下面的配置反序列化Kafka的输入:

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

2.2. csv filter

将逗号分隔的值数据解析为单个字段。默认情况下,过滤器自动生成字段名称(column n1、column2等),或者您可以指定一个名称列表。还可以更改列分隔符。
以下配置将CSV数据解析为columns字段中指定的字段名:

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

2.3. fluent codec

读取fluent 的msgpack模式。
下面的配置解码从fluent-log-ruby接收的日志:

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

2.4. json codec

解码(通过输入)和编码(通过输出)JSON格式的内容,为JSON数组中的每个元素创建一个事件。
下面的配置解码文件中的JSON格式的内容:

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

2.5. 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']
    }
  }
}

2.6. xml filter

将XML解析为字段。
下面的配置解析存储在message字段中的整个XML文档:

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

3. 提取字段

将数据解析为字段

3.1. dissect filter

使用分隔符将非结构化事件数据提取到字段中。剖析过滤器不使用正则表达式,速度非常快。但是,如果数据的结构因行而异,则grok过滤器更适合。
例如,假设您有一个包含以下消息的日志:

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

用下面的配置分析消息:

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

使用dissect filter后,事件将被分割为以下字段:

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

3.2. kv filter

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

ip=1.2.3.4 error=REFUSED

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

filter {
  kv { }
}

结果:

ip: 1.2.3.4
error: REFUSED

3.3. 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

4. Lookup Plugins补充数据

以下插件可以帮助你用额外的信息来丰富数据,比如GeoIP和用户代理信息:

4.1. dns filter

dns过滤器插件执行正向或反向dns查找。
下面的配置对source_host字段中的地址执行反向查找,并用域名替换它:

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

4.2. elasticsearch filter

elasticsearch过滤器将以前的日志事件中的字段复制到当前事件。
下面的配置显示了如何使用这个过滤器的完整示例。每当Logstash接收到“end”事件时,它都会使用这个Elasticsearch过滤器根据某个操作标识符查找匹配的“start”事件。然后它将@timestamp字段从“start”事件复制到“end”事件上的新字段。最后,使用date过滤器和ruby过滤器的组合,示例中的代码计算两个事件之间的时间持续时间(以小时为单位)。

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

4.3. geoip filter

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

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

4.4. http filter

http过滤器与外部web服务/REST api集成,并支持针对任何http服务或端点进行查找充实。这个插件非常适合许多丰富的用例,比如社交api、情感api、安全提要api和业务服务api。

4.5. 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]"}
        # 指定将存储查找数据的事件字段。如果查找返回多个列,数据将作为JSON对象存储在字段中。
        target => "user" 
      }
    ]
    # using add_field here to add & rename values to the event root
    # 从JSON对象中获取数据,并将其存储在顶级事件字段中,以便在Kibana中进行更容易的分析。
    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"
  }
}

4.6. 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"
  }
}

4.7. memcached filter

memcached过滤器支持对memcached对象缓存系统进行键/值查找充实。它同时支持读(GET)和写(SET)操作。对于安全分析用例来说,这是一个值得注意的补充。

4.8. 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"
  }
}

4.9. useragent filter

useragent过滤器将用户代理字符串解析为字段。
下面的示例接受代理字段中的用户代理字符串,将其解析为用户代理字段,并将用户代理字段添加到名为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"
  }

参考文档:https://www.elastic.co/guide/en/logstash/6.6/transformation.html

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值