Logstash:通过 lookups 来丰富数据

599 阅读6分钟

如果你想了解更多关于 lookup 的内容,请参阅文章 “Elastic:开发者上手指南” 中的 “丰富数据及 lookup” 章节。在今天的文章中,我来总结在 Logstash 中一些常用的 lookups。如下的这些插件可以帮助你使用附加信息丰富数据,例如 GeoIP 和用户代理信息:

Lookup 插件

dns filter

dns 过滤器插件执行标准或反向 DNS 查找。

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



1.  filter {
2.    dns {
3.      reverse => [ "source_host" ]
4.      action => "replace"
5.    }
6.  }


我们可以使用如下的例子来进行测试:

logstash.conf



1.  input {
2.    generator {
3.      message => '8.8.8.8'
4.      count => 1
5.    }
6.  }

8.  filter {
9.    dns {
10.      reverse => [ "message" ]
11.      action => "replace"
12.    }
13.  }

15.  output {
16.    stdout {
17.      codec => rubydebug
18.    }
19.  }


使用 Logstash 运行上面的配置文件:

./bin/logstash -f logstash.conf

elasticsearch filter

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

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

 1.        if [type] == "end" {
2.           elasticsearch {
3.              hosts => ["es-server"]
4.              query => "type:start AND operation:%{[opid]}"
5.              fields => { "@timestamp" => "started" }
6.           }
7.           date {
8.              match => ["[started]", "ISO8601"]
9.              target => "[started]"
10.           }
11.           ruby {
12.              code => 'event.set("duration_hrs", (event.get("@timestamp") - event.get("started")) / 3600) rescue nil'
13.          }
14.        }

更为详细的介绍,请阅读文章 “Logstash:运用 Elasticsearch filter 来丰富地理数据”。

geoip filter

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



1.  filter {
2.    geoip {
3.      source => "clientip"
4.    }
5.  }


在 Elastic Stack 8.x. 上,我们做如下的一个例子:

logstash.conf



1.  input {
2.    generator {
3.      message => '8.8.8.8'
4.      count => 1
5.    }
6.  }

8.  filter {
9.    mutate {
10.      rename => {"message" => "[clientip][ip]"}
11.    }

13.    geoip {
14.      source => "[clientip][ip]"
15.      target => "geoip"
16.    }
17.  } 

19.  output {
20.    stdout {
21.      codec => rubydebug
22.    }
23.  }


运行上面的 Logstash 配置文件:

./bin/logstash -f logstash.conf

详细阅读文章 “Logstash:Logstash 入门教程 (二)”。

http filter

http 过滤器与外部 Web 服务/REST API 集成,并启用针对任何 HTTP 服务或端点的查找扩充。 此插件非常适合许多丰富用例,例如社交 API、情感 API、安全源 API 和业务服务 API。

更为详细的介绍,请阅读文章 “Logstash:HTTP 过滤器介绍”。

jdbc_static filter

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

以下示例从远程数据库获取数据,将其缓存在本地数据库中,并使用查找来使用本地数据库中缓存的数据丰富事件。



1.  filter {
2.    jdbc_static {
3.      loaders => [ (1)
4.        {
5.          id => "remote-servers"
6.          query => "select ip, descr from ref.local_ips order by ip"
7.          local_table => "servers"
8.        },
9.        {
10.          id => "remote-users"
11.          query => "select firstname, lastname, userid from ref.local_users order by userid"
12.          local_table => "users"
13.        }
14.      ]
15.      local_db_objects => [ (2) 
16.        {
17.          name => "servers"
18.          index_columns => ["ip"]
19.          columns => [
20.            ["ip", "varchar(15)"],
21.            ["descr", "varchar(255)"]
22.          ]
23.        },
24.        {
25.          name => "users"
26.          index_columns => ["userid"]
27.          columns => [
28.            ["firstname", "varchar(255)"],
29.            ["lastname", "varchar(255)"],
30.            ["userid", "int"]
31.          ]
32.        }
33.      ]
34.      local_lookups => [ (3)
35.        {
36.          id => "local-servers"
37.          query => "select descr as description from servers WHERE ip = :ip"
38.          parameters => {ip => "[from_ip]"}
39.          target => "server"
40.        },
41.        {
42.          id => "local-users" 
43.          query => "select firstname, lastname from users WHERE userid = :id"
44.          parameters => {id => "[loggedin_userid]"}
45.          target => "user" (4)
46.        }
47.      ]
48.      # using add_field here to add & rename values to the event root
49.      add_field => { server_name => "%{[server][0][description]}" }
50.      add_field => { user_firstname => "%{[user][0][firstname]}" } (5)
51.      add_field => { user_lastname => "%{[user][0][lastname]}" }
52.      remove_field => ["server", "user"]
53.      jdbc_user => "logstash"
54.      jdbc_password => "example"
55.      jdbc_driver_class => "org.postgresql.Driver"
56.      jdbc_driver_library => "/tmp/logstash/vendor/postgresql-42.1.4.jar"
57.      jdbc_connection_string => "jdbc:postgresql://remotedb:5432/ls_test_2"
58.    }
59.  }


  1. 查询外部数据库以获取将在本地缓存的数据集。
  2. 定义用于构建本地数据库结构的列、类型和索引。 列名和类型应与外部数据库相匹配。
  3. 对本地数据库执行查找查询以丰富事件。
  4. 指定将存储查找数据的事件字段。 如果查找返回多列,则数据将作为 JSON 对象存储在字段中。
  5. 从 JSON 对象中获取数据并将其存储在顶级事件字段中,以便在 Kibana 中进行更轻松的分析。

更为详细的例子,请参考文章 “Logstash:Jdbc static filter plugin 介绍”。

jdbc_streaming filter

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

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



1.  filter {
2.    jdbc_streaming {
3.      jdbc_driver_library => "/path/to/mysql-connector-java-5.1.34-bin.jar"
4.      jdbc_driver_class => "com.mysql.jdbc.Driver"
5.      jdbc_connection_string => "jdbc:mysql://localhost:3306/mydatabase"
6.      jdbc_user => "me"
7.      jdbc_password => "secret"
8.      statement => "select * from WORLD.COUNTRY WHERE Code = :code"
9.      parameters => { "code" => "country_code"}
10.      target => "country_details"
11.    }
12.  }


更为详细的例子可一些参阅文章 “Logstash:运用 jdbc_streaming 来丰富我们的数据”。

memcached filter

Memcached 过滤器启用针对 Memcached 对象缓存系统的键/值查找扩充。 它支持读取 (GET) 和写入 (SET) 操作。 它是安全分析用例的显着补充。

更为详细的描述可以在文章中 “Logstash:运用 memcache 过滤器进行大规模的数据丰富” 看到。

translate filter

Translate 过滤器根据 hash 或文件中指定的替换值替换字段内容。 目前支持这些文件类型:YAML、JSON 和 CSV。

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



1.  filter {
2.    translate {
3.      field => "response_code"
4.      destination => "http_response"
5.      dictionary => {
6.        "200" => "OK"
7.        "403" => "Forbidden"
8.        "404" => "Not Found"
9.        "408" => "Request Timeout"
10.      }
11.      remove_field => "response_code"
12.    }
13.  }


详细阅读文章 “Logstash:Logstash translate 过滤器简介”。

useragent filter

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

以下示例获取代理字段中的用户代理字符串,将其解析为用户代理字段,并将用户代理字段添加到名为 user_agent 的新字段中。 它还删除了原始代理字段



1.  filter {
2.    useragent {
3.      source => "agent"
4.      target => "user_agent"
5.      remove_field => "agent"
6.    }
7.  }


应用过滤器后,事件将丰富用户代理字段。 例如:

 1.          "user_agent": {
2.            "os": "Mac OS X 10.12",
3.            "major": "50",
4.            "minor": "0",
5.            "os_minor": "12",
6.            "os_major": "10",
7.            "name": "Firefox",
8.            "os_name": "Mac OS X",
9.            "device": "Other"
10.          }

详细阅读文章 “Logstash:Logstash 入门教程 (二)” 以了解更多。