目录
1.1.执行核心操作(Performing Core Operations)
1.2.反序列化数据(Deserializing Data)
1.3.提取字段和整理数据(Extracting Fields and Wrangling Data)
1.4.通过查找丰富数据(Enriching Data with Lookups)
jdbc_static过滤器(jdbc_static filter)
jdbc_streaming过滤器(jdbc_streaming 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
,@timestamp
和message
字段进行指纹识别,并将哈希添加到名为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和用户代理信息)来丰富数据:
- 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.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"
}